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
Я не уверен, как получить больше отладочной информации о том, что не удалось.
- Может ли кто-нибудь помочь мне получить более подробную информацию о сбое?
- Если кто-то знает, почему это не удается, то это был бы отличный ответ!
- Другой способ доставки журналов постоянно (в реальном времени) также является приемлемым решением. Тем не менее, я знаю о 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 для этой функции (не уверен, почему вы не пошли с ним в первую очередь).