web-dev-qa-db-ja.com

Apacheパイプロギングが失敗する

単純なApacheパイプロギングディレクティブを書き込もうとしていますが、失敗します。ログファイルをELKに一元化するために、200個の応答コードをgrepしたいだけです。これは私が作成したカスタムログ形式です。

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

ここで何が起こっているのか理解できないようです。パイプロギングに関するapachesのドキュメントを読みましたが、間違って実行している可能性のあるものは何も見つかりません。

これはApache22.4.7で実行されています

よろしくお願いします。

[〜#〜] note [〜#〜]

これをさらに調べると、Apache2.2とApache2.4がこれを行う方法を変更したことがわかりました。以前はシェルが自動的に生成されていましたが、新しい2.4バージョンでは、手動でシェルを指定する必要があります。その結果、構文をこれに変更しました

CustomLog "|$/bin/grep -v '^200' /var/log/Apache2/pi-mirror.com/access.log" remove

この変更により、次のことが行われました。何らかの理由でApache2を再起動すると、そのコマンドのすべての出力がstdoutに吐き出され、ターミナルからすべてが表示されます。しかし、同じエラーメッセージで失敗します。 Apacheが実際にこれを繰り返し開始できないようで、これを修正するために何か他のことをする必要があるのではないかと思います。

1
Christopher

問題は、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/

1
ssgelm