Rotação de log com compactação?

1

Estou executando um processo no Linux (CentOS 7), que produz muitos resultados no stdout. Enviar tudo para um arquivo resultará em um tamanho de arquivo maior que 1 TB. Mas, felizmente, a saída é bastante compressível - consiste em muitos textos repetitivos.

Meu pensamento é, posso usar algum tipo de programa de rotação de log como os descritos aqui: ( Rotação de logs de stdout? ), mas onde uma vez que um log não é mais atual, ele é compactado (e nunca excluído)? Então eu acabo escrevendo, digamos, alguns GB para o arquivo, comprimo-lo e continuo escrevendo para um arquivo novo?

    
por LangeHaare 20.07.2018 / 19:24

1 resposta

5

Você pode usar logrotate para isso. O CentOS 7 está usando o systemd para que você possa configurar um scheduled logrotate task com algo parecido com isto:

  • Crie um arquivo de configuração logrotate em /etc/systemd/system chamado mylogrotate.config com o seguinte conteúdo:

    /path/to/your/logfile/*.log {
        compress
        copytruncate
        delaycompress
        minsize 1G
        missingok
        nomail
        notifempty
        rotate 30
    }
    

Isto irá dizer ao logrotate para fazer o seguinte:

  • Versões antigas de arquivos de log são compactadas com gzip por padrão.
  • Truncar o arquivo de log original no lugar depois de criar uma cópia, em vez de mover o arquivo de log antigo e, opcionalmente, criar um novo.
  • Adie a compactação do arquivo de log anterior para o próximo ciclo de rotação, para que você tenha dois arquivos de log descompactados.
  • Os arquivos de log são girados quando crescem acima de 1Gbytes.
  • Se o arquivo de log estiver faltando, vá para o próximo sem emitir uma mensagem de erro.
  • Não envie arquivos de log antigos para qualquer endereço.
  • Os arquivos de log são girados 30 vezes antes de serem removidos, portanto você terá 30 arquivos de log antigos. Qualquer coisa mais antiga que isso será deletada.

Crie um serviço systemd. Crie um arquivo em /etc/systemd/system chamado mylogrotate.service com o seguinte:

[Unit]
Description=Rotate My Log

[Service]
Type=oneshot
ExecStart=/usr/sbin/logrotate /etc/systemd/system/mylogrotate.config --state /etc/systemd/system/mylogrotate.state --verbose

Vamos agendar essa tarefa. Crie um terceiro arquivo em /etc/systemd/system chamado mylogrotate.timer com o seguinte:

[Unit]
Description=Rotate My Log Timer

[Timer]
OnCalendar=*:00:00
Persistent=true

[Install]
WantedBy=timers.target

Isto irá rodar o logrotate a cada hora.

Tudo foi configurado. Agora ative a tarefa agendada.

systemctl enable mylogrotate.timer
systemctl start mylogrotate.timer

Claro, faça tudo isso como root.

(Estou no Ubuntu, mas espero que isso funcione no CentOS sem problemas)

    
por 20.07.2018 / 20:18