Maneira correta de rotacionar registros Nginx

12

Gostaria de obter a rotação dos logs nginx que:

  1. funcionaria sem qualquer software extra (ou seja, melhor se sem "logrotate")
  2. criaria arquivos girados com nomes com base na data

A melhor abordagem é algo como o PostgreSQL - ou seja, na sua variável de configuração log_filename, eu posso especificar% Y-% m-% d estilo strftime, e ela mudará automaticamente a mudança de data (ou hora) do log.

Outra abordagem do apache - enviando logs via pipe para o programa rotatelogs.

Tanto quanto eu fui capaz de pesquisar - essa abordagem não existe. Tudo o que posso fazer é usar o logrotate com a opção dateext, mas ele tem seu próprio conjunto de desvantagens, e eu prefiro usar algo que funcione como | rotatelogs ou log_filename no PostgreSQL.

    
por Bryan 14.09.2009 / 14:24

4 respostas

7

Enquanto o mundo está dividido sobre se o humilde named pipe é amigo ou inimigo, é provavelmente a solução mais simples para o seu problema. Ele tem algumas desvantagens (em que você precisa criar os pipes antes do tempo), mas elimina a necessidade de um cron e permite que você use o filtro de canal de log de sua escolha.

Veja um exemplo usando o cronolog em access.log :

  1. Escolha um caminho para o nosso pipe nomeado. Eu pretendo manter meus logs em /var/log/nginx , então também colocarei meus canos. O nome é com você; Eu acrescento .fifo , e é access.log , então o meu será em /var/log/nginx/access.log.fifo .
  2. Exclua o arquivo, se existir.
  3. Crie um pipe nomeado para o arquivo de log:

    mkfifo /var/log/nginx/access.log.fifo
    
  4. Configure nginx.conf para apontar o log no canal que acabou de criar:

    access_log /var/log/nginx/access.log.fifo;
    
  5. Modifique seu script init.d para iniciar o roteador de registro ouvindo o canal antes de iniciarmos o servidor:

    LOGS="/var/log/nginx"
    pkill -f "/usr/sbin/cronolog --symlink $LOGS/access.log"
    ( cat $LOGS/access.log.fifo | /usr/sbin/cronolog --symlink $LOGS/access.log "$LOGS/%Y/%m/%d/access.log" ) &
    

    Uma linha de comando similar seria usada para rotatelogs caso você prefira cronolog - consulte os documentos para a sintaxe.

    Se o seu distrobution tiver um start-stop-daemon , você deve usá-lo, já que, teoricamente, ele tem algum conhecimento especial sobre a sua plataforma e está cuidando de pkill para você. Simplesmente envolva o comando em um script e passe-o como --exec para start-stop-daemon em seu init.d/nginx .

por 29.12.2010 / 10:31
1

Eu escrevi um programa simples, datelog, para dividir os logs comuns com base na data registrada, ao contrário da hora atual do sistema, quando a linha do log é vista pelo programa. Isso pode ou não ser exatamente o que o cronolog ou outro log splitter já faz, mas foi mais rápido escrever o meu próprio que descobrir o que os outros fazem.

Usando o ano e o mês na solicitação registrada, a linha é gravada em um arquivo ou canal que inclui o AAAAM calculado a partir dos dados registrados. Sim, isso é um pouco específico para o formato de log comum. O primeiro [é assumido para delimitar a data. Cuidado com os endereços IPv6. :)

Para a análise de log, é importante que cada log realmente contenha apenas as solicitações para cada mês respectivo, e cada log deve, idealmente, estar completo para os resultados corretos da análise. Não é suficiente determinar o nome do arquivo com base na hora atual dentro do divisor de log, porque uma solicitação lenta começando às 23:59:59 terminará no arquivo de log pelo mês errado.

Eu uso isso com o nginx por meio de um fifo nomeado que é verificado para existir antes de o nginx ser iniciado. Observe que há uma desvantagem no programa entre a detecção de erros e a saída em buffer, onde o datelog prefere atualmente a saída em buffer por motivos de desempenho, portanto, certifique-se de que sua configuração realmente funcione, especialmente ao usar os shell pipes, para não perder dados de log .

Código-fonte: link

Por favor, sinta-se livre para me enviar qualquer feedback e, claro, patches!

    
por 18.07.2011 / 04:35
1

Você pode conseguir isso usando um script bash simples e o cron:

#!/bin/bash
DATE=$(date +%Y-%m-%d-%H%M)
mv /var/log/nginx/access.log /var/log/nginx/nginx.access.log.$DATE
mv /var/log/nginx/error.log /var/log/nginx/nginx_error.log.$DATE
kill -USR1 'cat /var/run/nginx.pid'
sleep 1
gzip /var/log/nginx/access.log.$DATE
gzip /var/log/nginx/error.log.$DATE

Mais detalhes sobre como configurar o crontab etc. encontrados aqui: Rotating Nginx log files via Cron

    
por 27.02.2013 / 12:39
0

Eu tenho medo de não entender sua pergunta: como o nginx não suporta nenhum login interno, você terá que usar algo como

mv access.log access.log.$(date "+%Y-%m%d")
kill -USR1 $(cat master.nginx.pid)

em algum lugar em /etc/cron.daily (você precisa qualificar os nomes de arquivos acima com nomes de caminho completos, é claro) ou instalar os utilitários apache2 para ter acesso a rotatelogs.

    
por 14.09.2009 / 19:03