Solicitações de log do Apache quando elas entram e não quando terminam

7

Estou tentando diagnosticar um problema bizarro de falha de servidor ( O servidor responde a pings, mas não aceita conexões SSH até a reinicialização. 0% CPU ) onde a reinicialização do servidor obtém tudo de volta ao normal. Eu gostaria de ter meus logs de acesso do Apache (ou algum outro log) incluindo todos os pedidos que foram feitos corretamente quando a falha aconteceu, mas infelizmente o Apache não registra os pedidos até que eles sejam concluídos. Isso significa que, se uma solicitação estiver travando o servidor, essa solicitação nunca será concluída e, portanto, não será exibida nos logs.

Existe alguma maneira de configurar o Apache para criar um arquivo de log que é gravado quando as solicitações chegam?

    
por Ben Dilts 09.08.2011 / 19:21

2 respostas

14

Eu acho que você precisa de registro forense, veja este link: link

snippet:

Formato do registro forense:

Cada pedido é registrado duas vezes. A primeira vez é antes de ser processada (isto é, depois de receber os cabeçalhos). A segunda entrada de log é gravada após o processamento da solicitação ao mesmo tempo em que o registro normal ocorre.

Para identificar cada solicitação, um ID de solicitação exclusivo é atribuído. Esse ID forense pode ser registrado em log no log de transferência normal usando a string de formato% {forensic-id} n. Se você estiver usando mod_unique_id, seu ID gerado será usado.

A primeira linha registra o ID forense, a linha de solicitação e todos os cabeçalhos recebidos, separados por caracteres de pipe (|). Uma linha de amostra é semelhante à seguinte (tudo em uma linha):

+ yQtJf8CoAB4AAFNXBIEAAAAA | GET /manual/de/images/down.gif HTTP / 1.1 | Host: host local% 3a8080 | User-Agent: Mozilla / 5.0 (X11; U; Linux i686; en-US; rv% 3a1. 6) Gecko / 20040216 Firefox / 0.8 | Aceitar: image / png, etc ...

O caractere mais no início indica que esta é a primeira linha de log dessa solicitação. A segunda linha contém apenas um caractere negativo e o ID novamente:

-yQtJf8CoAB4AAFNXBIEAAAAA

O script check_forensic aceita como argumento o nome do arquivo de log. Ele procura por esses pares de +/- ID e reclama se uma solicitação não foi concluída.

    
por 09.08.2011 / 19:36
2

A resposta de Sandroid é certa para a sua pergunta, mas você também deve considerar executar uma captura de pacotes de rede. Se você tiver os recursos, espelhar a porta dentro do switch e usar uma segunda máquina executando o WireShark para registrar todo o tráfego IP pode realmente ajudar. Se algo estiver eliminando o servidor ao ponto em que os serviços não HTTP não estão respondendo, ele pode estar removendo a pilha IP antes que os dados incorretos cheguem ao Apache.

Se você puder garantir que a máquina que está executando a captura tenha hardware de rede e / ou drivers diferentes do outro. Seria uma droga chocar dois pelo preço de um. ; -)

    
por 09.08.2011 / 20:23