Apache エラーログ パイピングの失敗

Apache エラーログ パイピングの失敗

中央 syslog サーバーにログを記録しようとしています。Apache の ErrorLog を使用してロガーに直接パイプするか、syslog を転送するかのいずれかですが、何も機能せず、エラーは理解できません。カスタム ログは機能しますが、ErrorLog は機能しません。rsyslogd 7.4.4 を搭載した Ubuntu 14.04 で Apache/2.4.7 を使用しています。

私の vhost での設定 (ロガー オプションの後のスペースの有無は関係ありません):

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"

しかし、ティーはまだ不満を言っています。

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

一体なぜtee2 番目のパイプの後にオプションが選択されるのでしょうか。また、それを止めるにはどうすればよいのでしょうか。私は行き詰まっています。Google は私の友達ではありません。他のアドバイスがあればありがたいです。

答え1

最初のパイプは、Apache が新しいコマンドをフォークするためのコードですが、おそらく新しいシェル全体をフォークして新しいパイプを使用できるようにするのではなく、コマンドを実行するため、新しいパイプなども含めてすべてがコマンド引数として扱われます。おそらく、これをシェルにラップすることで回避できます。2 つの方法があり、1 つは明示的に次のとおりです。

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

もう 1 つは、プレフィックス キーワードを使用して暗黙的に行う方法です|$

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

根本的な原因は Apache 2.4 の変更です。cf.2.4 へのアップグレード:

Unix プラットフォームでは、ErrorLog または CustomLog のいずれかを使用して構成されたパイプ ログ コマンドは、2.2 以前では /bin/sh -c を使用して呼び出されました。2.4 以降では、パイプ ログ コマンドは直接実行されます。以前の動作を復元するには、パイプ ログのドキュメントを参照してください。

答え2

ErrorLogまだ が実装されていない Apache 2.2.31 でログ イベントを消去するソリューションを探しているときに、この投稿を見つけました。ErrorLogFormat私が思いついたソリューションは、他の人にも役立つと思います。

ErrorLogこれは、バッファリングされていないリファラーを削除しますsed

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

インライン unbuffered を使用してリファラーからクエリ文字列を削除します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

関連情報