Я хочу отправить свой журнал Apache в настраиваемом формате (GELF) на принимающий сервер UDP (на котором запущен Graylog2). Я был уверен, что все работает нормально, но через некоторое время я получил предупреждение, мой сервер не отвечает. Я вижу в журнале ошибок Apache целую кучу:
piped log program 'nc -w 1 -u logserver 12201' failed unexpectedly
Интересно, что на сервере с очень минимальным трафиком я постоянно вижу эту ошибку в журналах, даже если на веб-сайт нет трафика. И когда есть трафик, 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 запускает netcat с таймаутом в 1 секунду. Независимо от наличия каких-либо данных журнала netcat затем истекает через одну секунду (из-за опции -w 1) и завершает работу. Затем Apache перезапускает netcat. Вспенить, промыть, повторить.
Предлагаю удалить -w 1
из команды netcat в этом случае.
Отступая назад, я бы посоветовал использовать syslog для этой функции (не уверен, почему вы вообще не использовали его).