Como logrotate se comporta quando existe * e há um nome de arquivo explícito na rotação de log em um caminho?

2

A pergunta é um pouco longa! Deixe-me explicar com o exemplo abaixo. Eu

tem um arquivo de configuração de rotação de log em /etc/logrotate.d/ , que é usado para o uwsgi:

"/var/log/uwsgi/*.log" "/var/log/uwsgi/*/*.log" {
  copytruncate
  daily
  rotate 5
  compress
  delaycompress
  missingok
  notifempty
}

Digamos que eu tenha aproximadamente 12 módulos do uwsgi e eu queira manter um dos arquivos de log do aplicativo uwsgi mais do que outros, então eu tenho uma configuração como abaixo:

/var/log/uwsgi/app/MY_APP.log {
        daily
        missingok
        rotate 60
        compress
        delaycompress
        notifempty
        create 0640 www-data adm
}

Agora, a questão é como devo criar o log rotate como acima e manter * para outros 11 módulos. Eu não quero criar 11 log rotate com a mesma configuração, o que devo fazer para substituir apenas um módulo?

    
por ALH 18.07.2017 / 13:34

1 resposta

5

Primeiro, o logrotate não tem uma maneira fácil de substituir uma correspondência de glob existente de um arquivo. Simplesmente tentar adicionar uma correspondência mais específica posteriormente na configuração fornecerá uma mensagem de erro.

Então, para contornar isso, existem basicamente duas maneiras.

O primeiro é o mais fácil: coloque os logs que precisam de um tratamento diferente em um diretório diferente. Dessa forma, você pode até mesmo facilitar a alteração da configuração simplesmente fazendo um log de aplicativo em um diretório diferente. Exemplo:

"/var/log/uwsgi/*.log" "/var/log/uwsgi/keep05/*.log" {
  copytruncate
  daily
  rotate 5
  compress
  delaycompress
  missingok
  notifempty
}

"/var/log/uwsgi/keep60/*.log" {
  daily
  missingok
  rotate 60
  compress
  delaycompress
  notifempty
  create 0640 www-data adm
}

Uma segunda maneira seria criar uma exclusão no primeiro glob, aquele que corresponde a todos os 12 logs. Mas como o logrotate não tem uma maneira fácil de excluir um arquivo em particular, você fica com o que a biblioteca de correspondência de nome de arquivo regular fornece - e isso é essencialmente apenas um caractere no nome do arquivo. Se você fizer a regra de que os registros que precisam ser mantidos por 60 dias devem começar com um 6 e nenhum outro registro pode começar com um 6, você pode fazer isso:

"/var/log/uwsgi/*.log" "/var/log/uwsgi/*/[!6]*.log" {
  copytruncate
  daily
  rotate 5
  compress
  delaycompress
  missingok
  notifempty
}

"/var/log/uwsgi/app/6*.log" {
  daily
  missingok
  rotate 60
  compress
  delaycompress
  notifempty
  create 0640 www-data adm
}

Eu recomendo a primeira versão; provavelmente será mais fácil acompanhar se / quando você adicionar mais aplicativos.

    
por 25.07.2017 / 16:05