Apache 错误日志管道失败

Apache 错误日志管道失败

尝试将日志记录到中央系统日志服务器,要么直接使用 Apache 的 ErrorLog 传输到记录器,要么让系统日志转发,但没有任何效果,错误对我来说毫无意义。我可以让自定义日志工作,但 ErrorLog 不行。在 Ubuntu 14.04 上使用 Apache/2.4.7 和 rsyslogd 7.4.4。

在我的虚拟主机中进行配置(记录器选项后有无空格没有区别):

LogLevel warn
ErrorLog  "|/usr/bin/tee -a /var/log/apache2/error.log | /usr/bin/logger -tapache_err -plocal1.error"
CustomLog "|/usr/bin/logger -p local4.warning -t apache" combined

然后出现此错误:

/usr/bin/tee: invalid option -- 't'

还尝试过(带或不带双引号):

ErrorLog "|syslog:local1"

但后来得到:

(2)No such file or directory: AH00089: Couldn't start ErrorLog process 'syslog:local1'.
AH00015: Unable to open logs

甚至尝试过:

ErrorLog "| /usr/bin/tee -a /var/log/apache2/error.log | nc -u -j xxx.xxx.xxx.xxx 514"

但 tee 仍然在抱怨:

/usr/bin/tee: invalid option -- 'u'

为什么tee在第二个管道之后会选择选项?我该怎么做才能阻止这种情况?我被困住了,谷歌不是我的朋友,任何其他建议都值得赞赏。

答案1

第一个管道是 Apache 用于分叉新命令的代码,但它可能不会分叉整个新 shell,这将允许您使用新管道,而是执行命令,因此所有内容都被视为命令参数,包括新管道等。您可以通过将其包装到 shell 中来解决这个问题,使用两种方法,一种方法是明确的:

ErrorLog "|/bin/sh -c 'tee ... | logger ...'"

另一种是隐式的,使用前缀关键字|$

ErrorLog "|$tee ... | logger ..."

根本原因是 Apache 2.4 发生了变化,参见http://httpd.apache.org/docs/2.4/upgrading.html

在 Unix 平台上,在 2.2 及更早版本中,使用 ErrorLog 或 CustomLog 配置的管道日志记录命令使用 /bin/sh -c 调用。在 2.4 及更高版本中,管道日志记录命令直接执行。要恢复旧行为,请参阅管道日志记录文档。

答案2

在搜索ErrorLog尚未安装的 Apache 2.2.31 中涉及清除日志事件的解决方案时发现了此帖子ErrorLogFormat。这是我想出的解决方案,我认为其他人会觉得它很有用。

这将从ErrorLog使用无缓冲的中删除 referer sed

ErrorLog "|/bin/sed -u \'s/,\ referer: .*//\' >> /var/log/httpd/error_log"

使用内联无缓冲从 referer 中剥离查询字符串perl

ErrorLog "|/usr/local/bin/perl -ne \'$|=1;while (<>){$output = $_; $output =~ s/(referer:\ .*)\?/$1/; print $output}\'>>/var/log/httpd/error_log

调用 perl 脚本:

ErrorLog "|/usr/local/bin/perl /tmp/fuss.pl >> /var/log/httpd/error_log

相关内容