Gostaria de conseguir a rotação dos logs nginx que:
- funcionaria sem nenhum software extra (ie - melhor se sem "logrotate")
- criaria arquivos girados com nomes com base na data
A melhor abordagem é algo que o PostgreSQL possui - ou seja, em sua variável de configuração log_filename, eu posso especificar o estilo strftime% Y-% m-% d, e ele mudará automaticamente a alteração na data (ou hora) do logon.
Outra abordagem do apache - envio de logs via pipe para o programa rotatelogs.
Tanto quanto pude pesquisar - não existe essa abordagem. 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.
Respostas:
Enquanto o mundo está dividido sobre se o humilde tubo nomeado é amigo ou inimigo, é provavelmente a solução mais simples para o seu problema. Ele tem algumas desvantagens (em que você precisa criar os pipes com antecedência), mas elimina a necessidade de um cron e permite que você use o filtro de tubos de registro de sua escolha.
Aqui está um exemplo usando o cronolog em
access.log
:/var/log/nginx
, então vou colocar meus cachimbos lá também. O nome é com você; Acrescento.fifo
, e éaccess.log
, então o meu estará em/var/log/nginx/access.log.fifo
.Faça um pipe nomeado para o arquivo de log:
Configure
nginx.conf
para apontar o log para o canal que você acabou de criar:Modifique seu script init.d para iniciar o rotador de log ouvindo o canal antes de iniciarmos o servidor:
Uma linha de comando semelhante seria usada
rotatelogs
se você preferircronolog
- consulte os documentos para a sintaxe.Se sua distrobuição tiver um
start-stop-daemon
, você deve usá-lo, pois teoricamente ele possui qualquer conhecimento especial sobre sua plataforma e cuida depkill
você. Basta enrolar o comando em um script, e passá-lo como--exec
astart-stop-daemon
suainit.d/nginx
.fonte
Eu escrevi um programa simples, datelog, para dividir logs comuns com base na data do logon, em oposição à hora atual do sistema quando a linha de log é vista pelo programa. Isso pode ou não ser exatamente o que o cronolog ou outro divisor de logs já faz, mas foi mais rápido escrever o meu próprio do 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 AAAAMM computado a partir dos dados registrados. Sim, isso é um pouco específico para o formato de log comum. O primeiro [supõe-se que delimite a data. Cuidado com os endereços IPv6. :)
Para análise de log, é importante que cada log realmente contenha apenas as solicitações para cada mês respectivo, e cada log deve estar idealmente completo para resultados corretos da análise. Não é suficiente determinar o nome do arquivo com base no horário atual no divisor de logs, porque uma solicitação lenta iniciando às 23:59:59 acabará no arquivo de log no mês errado.
Eu uso isso com o nginx por meio de um fifo nomeado, que é verificado para existir antes do nginx ser iniciado. Observe que existe uma troca no programa entre a detecção de erros e a saída em buffer, em que o datelog atualmente prefere a saída em buffer por razões de desempenho, portanto, verifique se a sua configuração realmente funciona, especialmente ao usar pipes de shell, para não perder nenhum dado de log .
Código fonte: http://stuge.se/datelog.c
Por favor, sinta-se livre para me enviar qualquer feedback e, claro, patches!
fonte
Você pode conseguir isso usando um script bash simples e cron:
Mais detalhes sobre a configuração do crontab etc. são encontrados aqui: Rotação de arquivos de log do Nginx via Cron
fonte
Receio não ter entendido sua pergunta: como o nginx não oferece suporte a nenhuma logrotation integrada, você terá que usar algo como
em algum lugar no /etc/cron.daily (é necessário qualificar os nomes de arquivos acima com nomes de caminho completos, é claro) ou instalar os utilitários apache2 para ter acesso aos rotatelogs.
fonte