我正在尝试编写一个简单的 Apache 管道日志记录指令,但失败了。我只想 grep 出 200 个响应代码,以便将我的日志文件集中到 ELK。这是我创建的自定义日志格式。
LogFormat "%s %h %l %u %t \"%r\" %b" remove
这是管道日志
CustomLog "|/bin/grep -v '^200' /var/log/apache2/pi-mirror.com/access.log" remove
我在 apache2 错误日志中收到以下错误。
AH00106: piped log program '/bin/grep -v '^200' /var/log/apache2/pi-mirror.com/access.log' failed unexpectedly
我似乎无法弄清楚这里发生了什么。我通读了有关管道日志记录的 apache 文档,但找不到任何我可能做错的事情。
这是在 Apache2 2.4.7 上运行的
提前感谢您的帮助。
笔记
进一步研究后,我发现 apache 2.2 和 apache 2.4 改变了这一方式。以前会自动生成一个 shell,但在新的 2.4 版本中,您必须手动指定一个 shell。因此,我将语法更改为此
CustomLog "|$/bin/grep -v '^200' /var/log/apache2/pi-mirror.com/access.log" remove
此更改已产生以下效果。出于某种原因,当我重新启动 apache2 时,它会将该命令的所有输出吐出到 stdout,并且我从终端看到所有输出。但随后它会失败并显示相同的错误消息。这几乎就像 apache 无法真正重复启动它一样,这让我想知道我是否需要做其他事情来解决这个问题。
答案1
问题是您的 grep 试图过滤磁盘上的日志,但是当您使用带有管道的 CustomLog 时,所有新的日志消息都会发送到该日志而不是文件,因此文件不存在。您实际上可能想要的是:
CustomLog "|/bin/grep -v '^200' | cat >> /var/log/apache2/pi-mirror.com/access.log" remove
它将对 200(您最初拥有的)进行反向 grep,然后将其回显到日志文件中。有关更多信息,请参阅:https://workshop.avatarnewyork.com/post/filtering-apache-piped-logs-to-centralize-logging-of-errors-and-warnings/