awk 命令无法读取 apache 日志文件(用户错误)

awk 命令无法读取 apache 日志文件(用户错误)

被这个难住了:

less、cat 和 grep 都能够列出 apache 日志文件“/var/log/apache2/other_vhosts_access.log”的内容。但是当我使用 awk 抓取文件的最后 5 分钟时,它偶尔会起作用,但大多数时候不起作用。没有给出错误,那么如何调试这个?

awk -v date="$(date --date='5 minutes ago' +"%d/%b/%Y:%T")" '$0~date {f=1}f' /var/log/apache2/other_vhosts_access.log >> /var/log/apache2/test/$(date +"%F_%T")_output.log

在尝试读取文件时,awk 是否会遇到 Apache 写入文件的问题?在这种情况下,从 cat 管道传输到 awk 会更好吗?

我最初抓取最后 5 分钟数据的方法是使用日志文件中的时间戳加上一些其他信息,例如 IP 地址和字节数。所有这些都是因为多个日志条目会具有相同的时间戳。这种方法可行,但代码量大,而且很难确定日志何时轮换。

另一种方法是从日志文件中计数并保存最后读取的行号(作为索引),并在下次执行时从那里读取到文件末尾并更新索引。仍然必须记录上次运行的时间戳,以检查我们每次读取的时间不超过 5 分钟。重点是绘制数据图表,所以我宁愿丢失数据,也不愿处理破坏图表的大量峰值。

上面这一行简单得多,但也有自己的问题。如何检查我们是否没有意外复制数据或丢失数据?这一切都取决于 cron 以精确的 300 秒间隔执行的能力。我试图测试这一点,但到目前为止,上面的代码没有产生结果。将其转储到可执行文件中并添加到 cron 中,它还没有起作用。至少在我的终端上它偶尔会起作用。

5 * * * * /var/log/apache2/simple.sh 2>&1 > /dev/null

如果我完全搞错了,请告诉我。我发现了一些有关抓取最后 x 分钟日志文件的方法,但似乎没有一种方法能解决我列出的问题。

答案1

刚刚弄清楚为什么这个命令不起作用...如果日志文件中没有出现日期/时间,则 awk 命令不会匹配任何内容并且不会返回任何内容...我必须读取每一行的时间戳,将其转换为纪元并比较它是否在我感兴趣的范围内。

或者像@Serg建议的那样,通过删除秒数来减少要匹配的字符串。这不能保证匹配,但确实增加了匹配的可能性。(ymmv)

相关内容