Maneira correta / eficiente / confiável de importar entradas do arquivo de log para um banco de dados MySQL?

1

Gostaria de poder consultar nossos arquivos de log de acesso ao servidor para identificar padrões de abuso. Arquivos de log realmente não são muito questionáveis, e seria bastante fácil fazer o que eu queria se cada acerto fosse uma linha em um banco de dados MySQL.

Prefiro não alterar o servidor da web nem usar módulos que possam retardar o tempo de resposta das solicitações. O servidor web é otimizado para escrever entradas em um log de texto, e eu gostaria de deixar isso acontecer. ie. Deixe o servidor da Web gravar em um arquivo e mova as entradas do arquivo para as entradas do BD em um processo em lote mais tarde.

PHP é a linguagem do lado do servidor com a qual eu estou mais familiarizado, e seria trivial abrir um arquivo, analisá-lo linha por linha e inserir essas linhas em um banco de dados. O problema é que o log de acesso está sendo gravado em um ritmo de metralhadora. O PHP não pode analisar o log ao mesmo tempo em que o servidor da Web está tentando gravar nele. Nem o servidor web pode esperar pacientemente enquanto o PHP faz a análise.

É preciso que haja uma maneira de os dois fazerem seus trabalhos ao mesmo tempo, sem que entradas duplicadas sejam importadas ou faltando entradas.

Portanto, tenho duas ideias: primeiro, processar apenas os logs de rotação, ou seja, access.log.1 . Isso faz com que seja menos tempo real, mas evita o conflito de dois programas competindo pelos mesmos recursos. Ainda há a questão da rotação do log tentando rotacionar logs enquanto o PHP os está lendo, especialmente porque ele reutiliza os nomes dos arquivos conforme eles passam. Eu precisaria de alguma forma para garantir que o mesmo log não tenha sido lido novamente ou perdido porque os nomes estão em conflito.

Segundo, eu poderia usar um Queue liek a pipe. Eu nunca usei canos antes, então eu não sei como eles funcionam. Se:

  1. O servidor da Web o viu como um arquivo normal e escreveu para ele como um e
  2. o servidor não tentou substituí-lo por um arquivo rgular na reinicialização e
  3. O pipe manteria as entradas de texto em uma fila ordenada até que o PHP fosse chamado e retirasse as entradas no final e
  4. puxando as entradas para fora do final excluiu-as ...

Então pode ser exatamente o que estou procurando. A questão é, pode invocar PHP, puxar as coisas fora do pipe e, em seguida, terminar, para ser chamado novamente mais tarde por um cron? Ou o PHP tem que rodar continuamente como um dameon para usar um pipe? Ou, em outras palavras, um pipe ainda contém coisas, como um arquivo, se nada está do outro lado, certo?

Ou existe alguma outra maneira de ler os logs em um banco de dados com segurança e confiabilidade sem diminuir o tempo de exibição da página?

    
por Nick 17.04.2015 / 15:35

0 respostas

Tags