O log de piping do Apache para o netcat falha

5

Quero enviar meu log do Apache em um formato personalizado (GELF) para um servidor de recebimento UDP (executando o Graylog2). Eu tinha certeza que tudo estava funcionando bem, mas depois de um tempo, eu recebi um alerta, meu servidor não estava respondendo. Eu vejo no log de erros do Apache um monte de:

piped log program 'nc -w 1 -u logserver 12201' failed unexpectedly

Curiosamente, em um servidor com tráfego mínimo, vejo esse erro constantemente nos registros, mesmo quando não há tráfego para o site. E quando há tráfego, o log é enviado pelo netcat para o graylog - então ele funciona de qualquer maneira.

Se eu parar o Apache e reiniciá-lo, o erro continuará aparecendo no log de erros após a reinicialização. Depois de pará-lo, certifiquei-me de que não houvesse processos de fuga.

A configuração é:

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

E o CustomLog:

CustomLog "|nc -w 1 -u logserver 12201" graylog2_access

Não sei como obter mais informações de depuração sobre o que falhou.

  1. Alguém pode me ajudar a obter informações mais detalhadas sobre a falha?
  2. Se alguém souber por que isso falha, essa também seria uma ótima resposta!
  3. Outra maneira de enviar os logs constantemente (em tempo real) também é uma solução aceitável. No entanto, eu sei sobre logstash, mas neste caso, eu não preciso de análise, eu já posso saída no formato GELF. Eu tentei logstash no passado também e sempre foi, eventualmente, ficar sem memória e parar por conta própria.
por ETL 17.03.2014 / 03:09

1 resposta

5

Documentos do Apache: link

Apache will start the piped-log process when the server starts, and will restart it if it crashes while the server is running. (This last feature is why we can refer to this technique as "reliable piped logging".)

NC docs: 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.

O que você está vendo é o Apache iniciando o netcat com um tempo limite de 1 segundo. Independentemente de se houver algum dado de log, o netcat expirará após um segundo (devido à opção -w 1) e será encerrado. O Apache então reinicia o netcat. Espuma, enxaguar, repita.

Sugiro remover -w 1 do comando netcat nessa circunstância.

Voltando atrás, sugiro usar o syslog para essa função (não tenho certeza por que você não foi em primeiro lugar).

    
por 17.03.2014 / 03:55