logrotate não compacta / var / log / messages


11

Com o tempo, notei alguns registros /var/log, como auth, kerne messagesestavam ficando enormes. Fiz logrotateentradas para eles:

$ cat /etc/logrotate.d/auth.log 
/var/log/kern.log {
    rotate 5
    daily
}
$ cat /etc/logrotate.d/kern.log 
/var/log/kern.log {
    rotate 5
    daily
}
$ cat /etc/logrotate.d/messages 
/var/log/messages {
    rotate 5
    daily
    postrotate
        /bin/killall -HUP syslogd
    endscript
}

Também tenho a compressopção ativada:

$ grep compress /etc/logrotate.conf 
# uncomment this if you want your log files compressed
compress

Isso funciona muito bem para auth.log, kern.loge outros, o que significa que cada um desses logs é compactado e girado com gzip, com os últimos 5 dias de logs retidos. /var/log/messagesno entanto, não está sendo compactado, resultando em mais de 5 dias de logs:

$ ls /var/log/messages*
/var/log/messages           /var/log/messages-20100213
/var/log/messages-20100201  /var/log/messages-20100214
/var/log/messages-20100202  /var/log/messages-20100215
/var/log/messages-20100203  /var/log/messages-20100216
/var/log/messages-20100204  /var/log/messages-20100217
/var/log/messages-20100205  /var/log/messages-20100218
/var/log/messages-20100206  /var/log/messages-20100219
/var/log/messages-20100207  /var/log/messages-20100220
/var/log/messages-20100208  /var/log/messages-20100221
/var/log/messages-20100209  /var/log/messages-20100222
/var/log/messages-20100210  /var/log/messages-20100223
/var/log/messages-20100211  /var/log/messages-20100224
/var/log/messages-20100212

Conforme explicado em outra logrotatepergunta no ServerFault , os logs antigos (provavelmente) não estão sendo removidos porque as terminações dos arquivos são diferentes para cada arquivo. Parece ser porque os arquivos não estão sendo compactados em gzip.

O que posso fazer para /var/log/messagescompactar e girar os últimos 5 dias de logs retidos, assim como todos os meus outros arquivos de log? o que estou perdendo?

EDIT 1 : informações adicionais, conforme solicitado nas primeiras respostas.

Estou executando o Gentoo Linux. Meu /etc/logrotate.confarquivo:

$ cat /etc/logrotate.conf 
# $Header: /var/cvsroot/gentoo-x86/app-admin/logrotate/files/logrotate.conf,v 1.3 2008/12/24 20:49:10 dang Exp $
#
# Logrotate default configuration file for Gentoo Linux
#
# See "man logrotate" for details
# rotate log files weekly
weekly
#daily
# keep 4 weeks worth of backlogs
rotate 4
# create new (empty) log files after rotating old ones
create
# use date as a suffix of the rotated file
dateext
# uncomment this if you want your log files compressed
compress
# packages can drop log rotation information into this directory
include /etc/logrotate.d
notifempty
nomail
noolddir
# no packages own lastlog or wtmp -- we'll rotate them here
/var/log/wtmp {
    monthly
    create 0664 root utmp
    rotate 1
}
/var/log/btmp {
    missingok
    monthly
    create 0600 root utmp
    rotate 1
}

/etc/logrotate.d contém meus arquivos de configuração personalizados, como mencionado acima, juntamente com configurações para mysql, rsync, etc instaladas por esses pacotes.

Minha raiz crontabestá vazia:

$ sudo crontab -l
no crontab for root

Eu verifiquei tudo /etc/cron.{daily,hourly,monthly,weekly}para qualquer coisa relacionada a syslog, e há um script que gira /var/log/sysloge /var/log/auth.log.

Em seguida, criei um arquivo de configuração /var/log/messagesapenas logrotatecomo sugerido por CarpeNoctem:

$ cat logrotate-messages 
weekly
rotate 4
create
dateext
compress
notifempty
nomail
noolddir
/var/log/messages {
    rotate 5
    daily
    postrotate
        /bin/killall -HUP syslogd
    endscript
}

Então eu corri logrotatemanualmente:

$ logrotate -d logrotate-messages -f
reading config file logrotate-messages
reading config info for /var/log/messages 

Handling 1 logs

rotating pattern: /var/log/messages  forced from command line (5 rotations)
empty log files are not rotated, old logs are removed
considering log /var/log/messages
  log needs rotating
rotating log /var/log/messages, log->rotateCount is 5
dateext suffix '-20100224'
glob pattern '-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'
glob finding old rotated logs failed
renaming /var/log/messages to /var/log/messages-20100224
creating new /var/log/messages mode = 0644 uid = 0 gid = 0
running postrotate script
running script with arg /var/log/messages : "
        /bin/killall -HUP syslogd
"
compressing log with: /bin/gzip
$ which gzip
/bin/gzip
$ file /bin/gzip
/bin/gzip: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.9, stripped

De acordo com o log acima, logrotatecompactado o log com / bin / gzip, mas não vejo um arquivo de mensagens compactadas /var/log. Além disso, a busca por arquivos rotacionados antigos falhou.

EDIT 2 : adicionando saída de depuração da logrotateexecução após anexar um .gzsufixo aos /var/log/message-*arquivos antigos .

Começamos com:

$ ls /var/log/messages*
/var/log/messages              /var/log/messages-20100222.gz
/var/log/messages-20100219.gz  /var/log/messages-20100223.gz
/var/log/messages-20100220.gz  /var/log/messages-20100224.gz
/var/log/messages-20100221.gz

Em seguida, execute o logrotatenosso arquivo de configuração personalizado:

$ logrotate -d logrotate-messages -f
reading config file logrotate-messages
reading config info for /var/log/messages 

Handling 1 logs

rotating pattern: /var/log/messages  forced from command line (5 rotations)
empty log files are not rotated, old logs are removed
considering log /var/log/messages
  log needs rotating
rotating log /var/log/messages, log->rotateCount is 5
dateext suffix '-20100224'
glob pattern '-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'
removing /var/log/messages-20100219.gz
removing old log /var/log/messages-20100219.gz
destination /var/log/messages-20100224.gz already exists, skipping rotation

Desta vez, logrotateo glob consegue e encontra o sexto arquivo de log compactado, com a intenção de removê-lo. O arquivo não é realmente removido; Eu acho que é porque estamos executando no modo de depuração.

Estou curioso para saber se habilitar a delaycompressopção for /var/log/messagesajudará. Eu o habilitei e vou verificar os resultados na manhã seguinte.


Você pode postar seu logrotate.conf? Nada nos trechos que você compartilhou até agora explicaria o sufixo da data nesses arquivos de mensagens. O logrotate não era usado para oferecer suporte a sufixos de data nos arquivos de log rotacionados. Isso me leva a acreditar que algo completamente diferente está criando esses arquivos. Verifique / etc / crontab, root do crontab e /etc/cron.daily para ver se você tem outro script tentando executar o mesmo trabalho.
Jmtd

Além disso, você pode nos dizer qual distribuição de Linux você está executando? O Debian / Ubuntu tem seu próprio script de rotação de log que pode estar atrapalhando o seu material de rotação de log.
thepocketwade

Obrigado pela resposta. Estou executando o Gentoo Linux. Meus crontabs não estão gerenciando / var / log / messages. Consulte as novas informações na minha pergunta para obter detalhes.
Mike Mazur

Respostas:


8

Adicionando delaycompressà seção de configuração para /var/log/messagesresolvido o problema.

De man logrotate:

   delaycompress
          Postpone  compression of the previous log file to the next rota‐
          tion cycle.  This only has effect when used in combination  with
          compress.   It  can  be used when some program cannot be told to
          close its logfile and thus might continue writing to the  previ‐
          ous log file for some time.

Acho que sysklogdmeu daemon syslog não pode ser instruído a fechar seu arquivo de log e, portanto, isso é necessário.

Curiosamente, a configuração original que eu tinha (sem a delaycompressdiretiva) saiu diretamente de man logrotate(exceto que eu mudei weeklypara daily):

   # sample logrotate configuration file
   compress

   /var/log/messages {
       rotate 5
       weekly
       postrotate
           /usr/bin/killall -HUP syslogd
       endscript
   }

Está dizendo opção desconhecida desconhecida 'delalycompress' # logrotate -v /etc/logrotate.d/apc_rtbinfo.conf lendo o arquivo de configuração /etc/logrotate.d/apc_rtbinfo.conf lendo informações de configuração para /mnt/log/frengo/apc_rtbinfo.log erro: /etc/logrotate.d/apc_rtbinfo.conf:7 opção desconhecida 'delalycompress' - ignorando linha Manipulando 1 logs
Ashish Karpe

# cat /etc/logrotate.d/apc_rtbinfo.conf /mnt/log/frengo/apc_rtbinfo.log {daily missingok notifempty size 2000M comprime delalycompress sharedscripts copytruncate rotate 3}
Ashish Karpe

1
ok, obtive o erro, houve erro de digitação em "delalycompress" #
Ashish

Mas agora a questão é que log.1 tem mais de 2000M # du -sh /mnt/log/frengo/apc_rtbinfo.log* 0 /mnt/log/frengo/apc_rtbinfo.log 4.7G /mnt/log/frengo/apc_rtbinfo.log .1 80M /mnt/log/frengo/apc_rtbinfo.log.2 0 /mnt/log/frengo/apc_rtbinfo.log-20151222 679M /mnt/log/frengo/apc_rtbinfo.log-20151225.gz 681M / mnt / log / frengo /apc_rtbinfo.log-20151226.gz 691M /mnt/log/frengo/apc_rtbinfo.log-20151227.gz 0 /mnt/log/frengo/apc_rtbinfo.log-20151228 70M /mnt/log/frengo/apc_rtbinfo.log.2. gz 80M /mnt/log/frengo/apc_rtbinfo.log.3 80M /mnt/log/frengo/apc_rtbinfo.log.4
Ashish Karpe

5

É difícil dizer apenas com essas informações, mas posso dizer o que me salvou algumas vezes.

O Logrotate possui uma opção de depuração que imprimirá uma reprodução por reprodução de cada etapa necessária para o stdout. Então, neste caso, você poderia fazer:

logrotate -d /etc/logrotate.conf

A saída dirá o que exatamente está acontecendo. Além disso, se você quiser restringir a saída de depuração, poderá fazer

logrotate -d /etc/logrotate.d/messages

Embora você queira colocar temporariamente as principais opções do logrotate.conf nesse bloco de arquivos, uma vez que especificar o arquivo diretamente significa que ele nunca lerá as principais opções de configuração. A especificação do arquivo individual também significa que você pode usar a -fopção (force) em combinação com a opção debug para ver uma rotação real do arquivo de mensagens que está ocorrendo.


Tentei executar o logrotate manualmente, como você sugeriu, e ele diz que está compactando os logs, mas não encontro nenhum log compactado em lugar algum. Veja minha pergunta acima para obter detalhes.
precisa

1
renomeie os 5 arquivos de mensagens mais antigos para que terminem com um .gz e veja se o logrotate remove o mais antigo como deveria. Se isso acontecer, sabemos que o globbing está falhando devido ao gzip não estar funcionando corretamente. Isso pelo menos confirmará que a falta de compactação é responsável pela falta de rotação.
CarpeNoctem

Concluído, detalhes adicionados à pergunta acima. Estou curioso para saber se há algum problema de disputa com o /var/log/messagesarquivo ativo e a delaycompressopção ajudará.
Mike Mazur

Outro ponto interessante que eu descobri. Quando você ativa a opção -d, o comando logrotate não toca nos arquivos de log. Consulte o manual para mais informações. -d, --debug Turns on debug mode and implies -v. In debug mode, no changes will be made to the logs or to the logrotate state file.
CBR

1

Considere tentar esta configuração no seu logrotate.conf:

dateformat .%Y%m%d

e renomeie os arquivos de mensagens existentes para usar um ponto em vez de um hífen. Em seguida, tente seu logrotate novamente.

As pistas abaixo me levaram a acreditar que o traço pode estar causando a falha do globo se estiver sendo interpretado de alguma forma como uma opção (onde - seria consertar isso). Não faz sentido, mas apenas pode ser possível.

dateext suffix '-20100224'
glob pattern '-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'
glob finding old rotated logs failed

Eu não acho que essa seja a causa raiz. O formato da data atual, com um hífen, funciona bem para outros arquivos de log. A diferença entre esses arquivos de log e /var/log/messagesé que os /var/log/messagesarquivos girados não são compactados.
Mike Mazur
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.