Назад | Перейти на главную страницу

Журнал трубопроводов Apache в netcat не работает

Я хочу отправить свой журнал 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

Я не уверен, как получить дополнительную отладочную информацию о том, что не удалось.

  1. Может ли кто-нибудь помочь мне получить более подробную информацию о сбое?
  2. Если кто-то знает, почему это не удается, то это тоже будет отличным ответом!
  3. Другой способ доставки журналов на постоянной основе (в реальном времени) также является приемлемым решением. Однако я знаю о logstash, но в этом случае мне не нужен синтаксический анализ, я уже могу выводить в формате GELF. Раньше я тоже пробовал logstash, и в конце концов ему всегда не хватало памяти, и он останавливался сам по себе.

Документы 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 для этой функции (не уверен, почему вы вообще не использовали его).