Logrotate cria nomes longos e não exclui logs

6
postgres_db_dump_20091016.gz.1.1.1.1.1.1.1.1.1.1.1-20091021-20091021-20091021-20091021-20091021-20091021-20091021-20091021-20091021-20091021
postgres_db_dump_20091017.gz.1.1.1.1.1.1.1.1.1.1.1-20091021-20091021-20091021-20091021-20091021-20091021-20091021-20091021-20091021-20091021
postgres_db_dump_20091018.gz.1.1.1.1.1.1.1.1.1.1-20091021-20091021-20091021-20091021-20091021-20091021-20091021-20091021-20091021-20091021
postgres_db_dump_20091019.gz.1.1.1.1.1.1.1.1.1.1-20091021-20091021-20091021-20091021-20091021-20091021-20091021-20091021-20091021-20091021
postgres_db_dump_20091020.gz.1.1.1.1.1.1.1.1.1-20091021-20091021-20091021-20091021-20091021-20091021-20091021-20091021-20091021-20091021
postgres_db_dump_20091021.gz.1.1.1.1.1.1.1.1.1-20091021-20091021-20091021-20091021-20091021-20091021-20091021-20091021-20091021-20091021

Este é um exemplo de saída (nomes de arquivos) quando eu executo o logrotate pela força. De alguma forma, não está reconhecendo os arquivos antigos.

Exemplo de saída de depuração:

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/backup/postgres/postgres_db_dump_20091019.gz.1.1.1.1.1.1.1.1.1.1-20091021-20091021-20091021-20091021-20091021-20091021-20091021-20091021-20091021-20091021 to /var/backup/postgres/postgres_db_dump_20091019.gz.1.1.1.1.1.1.1.1.1.1-20091021-20091021-20091021-20091021-20091021-20091021-20091021-20091021-20091021-20091021-20091021
rotating log /var/backup/postgres/postgres_db_dump_20091020.gz.1.1.1.1.1.1.1.1.1-20091021-20091021-20091021-20091021-20091021-20091021-20091021-20091021-20091021-20091021, log->rotateCount is 4
dateext suffix '-20091021'
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/backup/postgres/postgres_db_dump_20091020.gz.1.1.1.1.1.1.1.1.1-20091021-20091021-20091021-20091021-20091021-20091021-20091021-20091021-20091021-20091021 to /var/backup/postgres/postgres_db_dump_20091020.gz.1.1.1.1.1.1.1.1.1-20091021-20091021-20091021-20091021-20091021-20091021-20091021-20091021-20091021-20091021-20091021
rotating log /var/backup/postgres/postgres_db_dump_20091021.gz.1.1.1.1.1.1.1.1.1-20091021-20091021-20091021-20091021-20091021-20091021-20091021-20091021-20091021-20091021, log->rotateCount is 4
dateext suffix '-20091021'
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/backup/postgres/postgres_db_dump_20091021.gz.1.1.1.1.1.1.1.1.1-20091021-20091021-20091021-20091021-20091021-20091021-20091021-20091021-20091021-20091021 to /var/backup/postgres/postgres_db_dump_20091021.gz.1.1.1.1.1.1.1.1.1-20091021-20091021-20091021-20091021-20091021-20091021-20091021-20091021-20091021-20091021-20091021

E arquivo de configuração:

daily
rotate 4
create 666 root root
maxage 30
dateext
compress
missingok
notifempty
noolddir

# system-specific logs may be also be configured here.
/var/log/* {
    size=10M
    postrotate 
        /usr/bin/killall -HUP syslog-ng
    endscript
}

/var/backup/postgres/postgres* {
    nocompress
    nocreate
}
    
por iElectric 21.10.2009 / 00:41

3 respostas

5

As outras respostas aqui estão corretas, você precisa alterar quais arquivos estão sendo correspondidos pela sua configuração. O mesmo problema pode ocorrer com os arquivos em / var / log, mas a combinação de compactação e o limite de tamanho de 10 milhões impede que isso aconteça.

Existe outro problema que você vai encontrar e que eu gostaria de destacar. Logrotate é construído para confiar em um nome de arquivo de log consistente para rodar arquivos antigos. Quando processa um arquivo de log, ele usa isso como um nome base para localizar todas as versões antigas, procurando a extensão específica que as versões antigas teriam. É isso que as coisas da glob no seu log de depuração estão procurando. Como o seu nome de arquivo muda toda vez por causa da data, ele nunca voltará e olhará para os antigos porque o nome do arquivo no qual ele está trabalhando agora não corresponde.

Existem duas coisas que você poderia fazer. A primeira opção seria configurar postgres ou qualquer script que esteja criando esse arquivo de despejo para não usar a data. Manter o nome do arquivo consistente permitirá que o logrotate faça isso e limpe os antigos. Alternativamente, você poderia pular o logrotate completamente e colocar algo assim em seu crontab:

0 4 * * * find /var/backup/postgres/postgres_db_dump_*.gz -mtime +10 -delete

Isso seria executado todas as noites e excluiria os arquivos de despejo com mais de 10 dias.

    
por 21.10.2009 / 01:34
6
/var/log/* {
    size=10M
    postrotate 
        /usr/bin/killall -HUP syslog-ng
    endscript
}

O /var/log/* é o seu problema. Isso corresponde a todos os arquivos em / var / log, incluindo os arquivos já compactados. Você precisará refinar esse padrão de correspondência de glob para corresponder apenas aos arquivos não compactados.

    
por 21.10.2009 / 01:20
5

A manpage para logrotate diz

   Please  use wildcards with caution.  If you specify *, logrotate will rotate all files,
   including previously rotated ones.  A way around this is to use the olddir directive or
   a more exact wildcard (such as *.log).
    
por 21.10.2009 / 01:22