Eu tenho uma caixa CentOS executando rsyslog e logrotate como meu servidor syslog para vários dispositivos de rede. Estou brincando com isso há um tempo, a peça de logrotate/compressão está funcionando bem, mas não consigo fazer com que ele exclua os antigos logs .gz compactados. Aqui está a configuração básica:
Os logs são armazenados em: /var/log/syslog e cada host cria uma nova subpasta com base em seu endereço IP ou nome de host. Eu tenho dois hosts específicos que são muito conversadores, então tenho regras específicas para eles truncarem após 5 GB. A ideia é compactar e iniciar um novo log todos os dias e manter registros de 60 dias.
Aqui estão minhas configurações (a maioria delas não foi criada por mim, mas mantive e modifiquei várias delas):
gato /etc/cron.hourly/logrotate
#!/bin/sh`enter code here`
/usr/sbin/logrotate -s /var/lib/logrotate/logrotate.status /etc/logrotate.conf
EXITVALUE=$?
if [ $EXITVALUE != 0 ]; then
/usr/bin/logger -t logrotate "ALERT exited abnormally with [$EXITVALUE]"
fi
exit 0
gato /etc/logrotate.d/syslog
/var/log/cron
/var/log/maillog
/var/log/messages
/var/log/secure
/var/log/spooler
{
compress
daily
#delaycompress
dateext
missingok
rotate 60
maxage 60
sharedscripts
postrotate
/bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
endscript
}
gato /etc/logrotate.conf
/var/log/syslog/*/*.log {
daily
rotate 60
maxage 60
compress
}
daily
rotate 60
create
dateext
compress
include /etc/logrotate.d
/var/log/wtmp {
monthly
create 0664 root utmp
minsize 1M
rotate 1
}
/var/log/btmp {
missingok
monthly
create 0600 root utmp
rotate 1
}
# system-specific logs may be also be configured here.
# Specific rule for HOST_A
/var/log/syslog/HOST_A/*.log {
daily
size 5G
rotate 30
maxage 30
compress
}
# Specific rule for HOST_B
/var/log/syslog/HOST_B/*.log {
daily
size 5G
rotate 30
maxage 30
compress
}
E aqui está um exemplo do que tenho na minha pasta \var\log\syslog\host_a:
ls /var/log/syslog/HOST_A/ | wc-l
104
ls /var/log/syslog/HOST_A/ -lh
-rw------- 1 root root 416M Jun 20 23:59 HOST_A_2018_06_20.log.1.gz
-rw------- 1 root root 64M Jun 20 16:18 HOST_A_2018_06_20.log.2.gz
-rw------- 1 root root 1.5G Jun 21 23:59 HOST_A_2018_06_21.log.1.gz
<many files redacted>
-rw------- 1 root root 1.6G Sep 4 23:59 HOST_A_2018_09_04.log.1.gz
-rw------- 1 root root 1.5G Sep 5 23:59 HOST_A_2018_09_05.log.1.gz
-rw------- 1 root root 7.7G Sep 6 10:58 HOST_A_2018_09_06.log
Então, você pode ver acima, ele não está removendo os logs .gz arquivados antigos após 60 dias. É mantê-los indefinidamente. Tive que entrar periodicamente e excluir manualmente os arquivos mais antigos para manter o tamanho baixo. Esses arquivos vão de 20/06 a 06/09 (hoje), ou seja, 104 dias. Tenho certeza de que está configurado incorretamente, mas não tenho certeza do que estou perdendo. Qualquer ajuda seria apreciada.
Responder1
Você está usando dois mecanismos para arquivos de log diários e eles não estão cooperando entre si.
Por um lado, você permite que o syslog gere arquivos diários, por outro lado, você permite que o logrotate gire os arquivos. O Logrotate tratará cada arquivo diário como um conjunto exclusivo e separado de arquivos (ele não considera HOST_A_2018_09_05.log relacionado a HOST_A_2018_09_06.log) para girar, portanto, nunca chega a cinco arquivos por padrão.
É melhor não incluir a data no nome do arquivo ou deixar o syslog fazer sua própria remoção de arquivos antigos.