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 в прошлом, и он всегда заканчивал память и останавливался сам по себе.

1 ответ

Решение

Документы Apache: http://httpd.apache.org/docs/2.2/logs.html

Apache запустит процесс piped-log при запуске сервера и перезапустит его, если произойдет сбой во время работы сервера. (Эта последняя особенность - то, почему мы можем назвать эту технику "надежной регистрацией трубопровода".)

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

Другие вопросы по тегам