Como combinar logrotate com o log4j “rolling” file-appender?

3

Nós temos um aplicativo Java, que usa log4j e rotaciona seus próprios logs diariamente:

  • O arquivo de log usado atualmente é /var/log/foo/foo.log
  • Ele é movido para /var/log/foo/foo.log.YYYY-MM-dd quando o dia muda

Preferimos não alterar sua configuração ...

No entanto, queremos:

  1. Compacte o arquivo depois que ele for renomeado
  2. Retém apenas um certo número deles

Embora não seja difícil escrever um cron-job para fazer as duas coisas, preferimos ficar no framework logrotate ...

Eu crio o seguinte /etc/logrotate.d/foo :

/var/log/foo/foo.log.* { daily rotate 2 compress delaycompress missingok notifempty }

mas não faz nada:

reading config file /etc/logrotate.d/foo

Handling 1 logs

rotating pattern: /var/log/foo/foo.log.*  after 1 days (2 rotations)
empty log files are not rotated, old logs are removed
considering log /var/log/foo/foo.log.2017-06-28
  log does not need rotating
considering log /var/log/foo/foo.log.2017-06-29
  log does not need rotating
considering log /var/log/foo/foo.log.2017-06-30
  log does not need rotating
considering log /var/log/foo/foo.log.2017-07-01
  log does not need rotating
considering log /var/log/foo/foo.log.2017-07-02
  log does not need rotating
considering log /var/log/foo/foo.log.2017-07-03
  log does not need rotating
considering log /var/log/foo/foo.log.2017-07-04
  log does not need rotating

Como faço para compactar os arquivos e excluir os mais antigos, quando o número total deles excede 2?

    
por Mikhail T. 05.07.2017 / 22:05

1 resposta

1

Eu realmente não acho que você conseguirá fazer o que quiser com o logrotate sem alguns comandos externos. Além disso, o padrão /var/log/foo/foo.log.* trataria cada arquivo individual como se fosse um log separado a ser rotacionado, não como um conjunto de arquivos girados.

man logrotate Please use wildcards with caution. If you specify *, logrotate will rotate all files, including previously rotated ones.

De qualquer forma, talvez algo assim? Basta definir sua condição de rotação que nunca será alcançada, já que o log4j já está manipulando a rotação parcialmente. Em seguida, coloque o restante em um script prerotate ?

/var/log/foo/foo.log {
        size 100g # something big that will never be reached/rotated since log4j does this.
        missingok
        notifempty
        # delete the other logs over 7 days old
        prerotate
            find /var/log/foo/ -name 'foo.log.*' -mtime +7 -delete
            nice gzip /var/log/foo/foo.log.*
        endscript
}
    
por 05.07.2017 / 22:47