Um dos meus servidores ficou sem espaço recentemente. Então comecei a pesquisar sobre isso. Os nginx
logs ocuparam metade da partição. Além disso, notei uma coisa estranha. Para muitos sites (60%) rotações extras quando presentes ( example.com-access.log.53.gz
quando rotate 52
). E a maioria dos maiores - mas não todos - tinha apenas duas rotações:
example.com-access.log
example.com-access.log.53.gz
50% das toras tinham apenas essas duas rotações. Às vezes havia apenas buracos nas rotações (30%): uma lima ou mais. *.log.1
muitas vezes faltava (25%). Às vezes havia ambos *.log.1
e *.log.1.gz
(2 de 172).
Você pode explicar essas rotações ausentes/duplicadas? *.log
+ *.log.53.gz
case me faz pensar que em algum momento não foi possível girar *.log.1
para *.log.2.gz
. Mas não iria parar depois de mal sucedida gzip
? Então não deve haver buracos. Ou pelo menos deve estar *.log.1
presente se não estiver, não deve?
Estou executando o servidor Debian, se alguma coisa.
/etc/logrotate.conf
:
# see "man logrotate" for details
# rotate log files weekly
weekly
# keep 4 weeks worth of backlogs
rotate 4
# create new (empty) log files after rotating old ones
create
# uncomment this if you want your log files compressed
#compress
# packages drop log rotation information into this directory
include /etc/logrotate.d
# no packages own wtmp, or btmp -- we'll rotate them here
/var/log/wtmp {
missingok
monthly
create 0664 root utmp
rotate 1
}
/var/log/btmp {
missingok
monthly
create 0660 root utmp
rotate 1
}
# system-specific logs may be configured here
/etc/logrotate.d/nginx
:
/var/log/nginx/*.log {
weekly
missingok
rotate 52
compress
delaycompress
notifempty
create 0640 www-data adm
size 50M
sharedscripts
prerotate
if [ -d /etc/logrotate.d/httpd-prerotate ]; then \
run-parts /etc/logrotate.d/httpd-prerotate; \
fi \
endscript
postrotate
[ -s /run/nginx.pid ] && kill -USR1 `cat /run/nginx.pid`
endscript
}
/etc/logrotate.d/httpd-prerotate
não existe.
tl;dr Duplicatas podem ser produzidas se a compressão (
gzip
) foi interrompida. Uma dessas duplicatas (ifsharedscripts
) faz com que eventualmente deixe apenas uma rotação gzipada (#rotate + 1
).Aqui está uma versão simplificada do que está acontecendo nos bastidores (logset é uma entrada
/path/to/dir/*.log {...}
na configuração):Assim,
sharedscripts
normalmente com um erro, que ocorre ao manipular um arquivo de log pertencente a um conjunto de logs, interrompe o processamento de todo o conjunto de logs. Sem ele, o processamento de apenas um arquivo de log é interrompido.Mas a rotação gzipada inexistente ou a 1ª rotação de um arquivo de log não conta como um erro. Como não acontece quando o próprio arquivo de log não existe se
missingok
(não importa no caso de um padrão). Também um erro duranteprerotateSingleLog()
a fase comsharedscripts
não quebra o loop.Observe que fiz muitas simplificações ao compilar o código acima. Consulte o original em caso de dúvida.
Com isso , os únicos casos em que posso ver onde pode haver arquivos ausentes ou extras é quando
logrotate
é interrompido. Isso pode explicar asrotate + 1
rotações (rotações gzipadas foram renomeadas, mas a última não foi removida). Além disso, quandogzip
é interrompido, deixa o arquivo de destino para trás. Isso explica ter ambos*.log.1
e*.log.1.gz
rotações. Ainda sem explicação para os buracos nas rotações.UPD Parece que duplicatas (
*.log.1
+*.log.1.gz
) produzem um erro :Isso interrompe o processamento após a
prerotateSingleLog()
fase. Nesse ponto, todas as rotações compactadas com gzip foram renomeadas. Mas renomear*.log -> *.log.1
e remover*.log.${rotate + 1}.gz
são ignorados.*.log
crescem cada vez mais e, eventualmente, você fica sem espaço.Isso explica tudo, exceto
*.log.1
rotações ausentes. Mas provavelmente é tão bom quanto ele ganha.Portanto, cuidado com os erros na rotação de logs. Você pode identificar o problema identificando a linha "error:" na
logrotate
saída (mesmo não detalhada).Como bônus, um script que exibe o conteúdo de um diretório de log de maneira agradável (classificação natural, com tamanhos):
E outro que permite verificar se você tem os problemas que encontrei: