Apacheログをカスタム形式(GELF)でUDP受信サーバー(Graylog2を実行)に送信したいと思います。すべてが正常に機能していることは確かでしたが、しばらくすると、サーバーが応答しなくなったというアラートが表示されました。 Apacheのエラーログに次のようなものがたくさんあります。
piped log program 'nc -w 1 -u logserver 12201' failed unexpectedly
興味深いことに、トラフィックが非常に少ないサーバーでは、Webサイトへのトラフィックがない場合でも、ログにこのエラーが常に表示されます。また、トラフィックがある場合、ログはnetcatからgraylogに送信されるため、関係なく機能します。
Apacheを停止して再起動すると、再起動後もエラーログにエラーが表示され続けます。停止した後、暴走するプロセスが残っていないことを確認しました。
構成は次のとおりです。
LogFormat "{ \"version\": \"1.1\", \"Host\": \"%V\", \"short_message\": \"%r\", \"full_message\": \"%r, status: %>s, %O bytes, User Agent: %{User-Agent}i\", \"timestamp\": %{%s}t, \"level\": 6, \"_user_agent\": \"%{User-Agent}i\", \"_source_ip\": \"%a\", \"_duration_usec\": %D, \"_duration_sec\": %T, \"_request_size_byte\": %O, \"_http_status\": %s, \"_http_request_path\": \"%U\", \"_http_request\": \"%U%q\", \"_http_method\": \"%m\", \"_http_referer\": \"%{Referer}i\" }" graylog2_access
そしてCustomLog:
CustomLog "|nc -w 1 -u logserver 12201" graylog2_access
何が失敗したかについて、より多くのデバッグ情報を取得する方法がわかりません。
Apacheドキュメント: http://httpd.Apache.org/docs/2.2/logs.html#piped
Apacheは、サーバーの起動時にパイプログプロセスを開始し、サーバーの実行中にクラッシュした場合は再起動します。 (この最後の機能が、この手法を「信頼性の高いパイプロギング」と呼ぶことができる理由です。)
NCドキュメント:man nc
-w timeout Connections which cannot be established or are idle timeout after timeout seconds. The -w flag has no effect on the -l option, i.e. nc will listen forever for a connection, with or without the -w flag. The default is no timeout.
表示されているのは、Apacheが1秒のタイムアウトでnetcatを起動していることです。ログデータがあるかどうかに関係なく、netcatは1秒後にタイムアウトし(-w 1オプションのため)、終了します。その後、Apacheはnetcatを再起動します。泡立てて、すすぎ、繰り返します。
この状況では、netcatコマンドから-w 1
を削除することをお勧めします。
一歩下がって、この関数にsyslogを使用することをお勧めします(そもそもなぜsyslogを使用しなかったのかわかりません)。