Всем привет,
Есть ли способ иметь режим реального времени с журналом в нескольких файлах (ротация журналов), например, access.log.0, access.log.1, ...? Я использую nginx, но это не относится к нему и должно быть общей проблемой.
Это легко без реального времени, так как мы можем просто агрегировать весь журнал и запустить программу на нем.
Проблема в том, что если я просто использую -f access.log.0, у меня не будет моих старых данных (и я не уверен, что при выполнении ротации журнала он сохранит текущие данные?). Или, если я перезапущу goaccess, я потеряю старые данные.
Один из способов, который я нашел, состоял в том, чтобы загрузить агрегацию старых файлов с --keep-db, а затем запустить goaccess с --read-from-disk и --keep-db, но если я перезапущу его несколько раз в один и тот же день, данные из acess.log.0 повторно считываются и сохраняются несколько раз. Так что все еще не решение.
Другой способ - постоянно запускать внешнюю программу, которая берет все старые файлы и следит за текущим. Но это кажется немного лишним.
Спасибо,
Том
В настоящее время нет возможности использовать функции реального времени при передаче нескольких файлов журналов. Это будет рассмотрено в #428 и #459. Как вы сказали, обходным путем было бы собрать несколько журналов, добавить их в новый файл журнала и передать его в GoAccess.
Однако просто для того, чтобы прояснить ротацию журналов, GoAccess отобразит содержимое нового файла журнала, как в случае tail -F
.
Ok ! Ждет его.
Тем временем для людей с такой же проблемой я нашел обходной путь. Мой служебный скрипт содержит первую строчку для разбора старых файлов и сохранения их в БД, а вторая запускает goaccess в реальном времени:
zcat /var/log/nginx/access.log*gz | goaccess -p /etc/goaccess.conf -a -o /dev/null --keep-db-files
goaccess -p /etc/goaccess.conf -f /var/log/nginx/access.log --real-time-html -a -o /usr/share/nginx/html/goaccess.html --load-from-disk
С помощью этого метода я могу перезапустить службу (или перезагрузить) без двойного разбора, и в реальном времени тоже работает со старыми данными.
Я отправил фиксацию , которая позволяет выводить статистику в реальном времени из потока или незакрытого STDIN, т. е. tail -f, а также анализировать несколько журналов в режиме реального времени:
goaccess --log-format=COMBINED access.log access.log.1
или
tail -f access.log | goaccess --log-format=COMBINED -
или даже
tail -f access.log | goaccess --log-format=COMBINED -o report.html --real-time-html -
Это также открывает возможность фильтрации данных в реальном времени из канала, например:
tail -f access.log | grep -i --line-buffered 'firefox' | goaccess --log-format=COMBINED -
Следует отметить, что tail -f будет держать канал открытым, даже если goaccess уже вышел. Например, tail -f syslog | grep -q 'cron'
tail завершится на SIGPIPE, однако он получит только SIGPIPE
до тех пор, пока в файл tail'а не будет записан лишний байт. Однако SIGTERM, SIGINT
должен нормально закрыть хвост.
Не стесняйтесь собирать из мастера , чтобы проверить это, иначе он будет удален в следующем выпуске. Спасибо.
Самый полезный комментарий
Я отправил фиксацию , которая позволяет выводить статистику в реальном времени из потока или незакрытого STDIN, т. е. tail -f, а также анализировать несколько журналов в режиме реального времени:
или
или даже
Это также открывает возможность фильтрации данных в реальном времени из канала, например:
Следует отметить, что tail -f будет держать канал открытым, даже если goaccess уже вышел. Например,
tail -f syslog | grep -q 'cron'
tail завершится на SIGPIPE, однако он получит толькоSIGPIPE
до тех пор, пока в файл tail'а не будет записан лишний байт. ОднакоSIGTERM, SIGINT
должен нормально закрыть хвост.Не стесняйтесь собирать из мастера , чтобы проверить это, иначе он будет удален в следующем выпуске. Спасибо.