尝试将日志记录到中央系统日志服务器,要么直接使用 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