大家好,
有没有办法在多个文件(日志轮换)中实现实时模式,如 access.log.0、access.log.1、...? 我使用nginx,但它不是特定于它,应该是一个常见问题。
没有实时性很容易,因为我们可以汇总所有日志并在其上运行程序。
问题是,如果我只使用 -f access.log.0 我没有旧数据(并且不确定日志轮换完成后是否会保留当前数据?)。 或者,如果我重新启动 goaccess,我会丢失旧数据。
我发现的一种方法是使用 --keep-db 加载旧文件的聚合,然后使用 --read-from-disk 和 --keep-db 启动 goaccess 但如果我在同一天多次重新启动它, acess.log.0 中的数据被重新读取并保存多次。 所以还是没有解决办法。
另一种方法是让一个始终运行的外部程序获取所有旧文件并跟踪当前文件。 但这似乎有点过度杀戮。
谢谢,
汤姆
目前,在管道传输多个日志文件时无法获得实时功能。 这将在#428 和#459 中解决。 正如您所说,一种解决方法是跟踪多个日志并将它们附加到一个新的日志文件并将其提供给 GoAccess。
但是,为了澄清日志轮换,GoAccess 将显示新日志文件的内容,就像tail -F
的情况一样。
好的 ! 等待它。
对于有同样问题的人,我同时找到了一种解决方法。 我的服务脚本包含用于解析旧文件并将其保存到数据库的第一行,第二行实时启动 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 -
需要注意的一点是,即使 goaccess 已经退出,tail -f 也会保持管道打开。 例如, tail -f syslog | grep -q 'cron'
tail 将在 SIGPIPE 上退出,但是它只会得到SIGPIPE
,直到一个额外的字节被写入 tail'd 文件。 SIGTERM, SIGINT
应该可以很好地关闭尾部。
随意从master构建来测试它,否则它将在即将发布的版本中推出。 谢谢。
最有用的评论
我已经推送了一个提交,它能够从流或未关闭的 STDIN 输出实时统计信息,即 tail -f 以及在实时模式下解析多个日志:
要么
甚至
它还开启了从管道过滤实时数据的可能性,例如:
需要注意的一点是,即使 goaccess 已经退出,tail -f 也会保持管道打开。 例如,
tail -f syslog | grep -q 'cron'
tail 将在 SIGPIPE 上退出,但是它只会得到SIGPIPE
,直到一个额外的字节被写入 tail'd 文件。SIGTERM, SIGINT
应该可以很好地关闭尾部。随意从master构建来测试它,否则它将在即将发布的版本中推出。 谢谢。