
Estou executando um processo no Linux (CentOS 7) que produz muita saída no stdout. Enviar tudo para um arquivo resultará em um tamanho de arquivo superior a 1 TB. Mas, felizmente, a saída é bastante compressível - consiste em muito texto bastante repetitivo.
Meu pensamento é: posso usar algum tipo de programa de rotação de log como os descritos aqui: (Rotação de log de stdout?), mas quando um log não é mais atual, ele é compactado (e nunca excluído)? Então acabo escrevendo, digamos, alguns GB no arquivo, compacto-o e continuo gravando em um arquivo novo?
Responder1
Você pode usarlogrotatepor esta. CentOS 7 está usandosistemapara que você possa configurar umtarefa de logrotate agendadacom algo assim:
Crie um arquivo de configuração logrotate
/etc/systemd/system
chamadomylogrotate.config
com o seguinte conteúdo:/path/to/your/logfile/*.log { compress copytruncate delaycompress minsize 1G missingok nomail notifempty rotate 30 }
Isso dirá ao logrotate para fazer o seguinte:
- Versões antigas de arquivos de log são compactadas com gzip por padrão.
- Trunque o arquivo de log original após 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 rotacionados quando ultrapassam 1 Gbytes.
- Se o arquivo de log estiver faltando, passe para o próximo sem emitir uma mensagem de erro.
- Não envie arquivos de log antigos para nenhum 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á excluída.
Crie um serviço systemd. Crie um arquivo /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 esta tarefa. Crie um terceiro arquivo /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
Isso executará o logrotate a cada hora.
Tudo foi configurado. Agora habilite a tarefa agendada.
systemctl enable mylogrotate.timer
systemctl start mylogrotate.timer
Claro, faça tudo isso como root.
(Estou no Ubuntu, mas espero que funcione no CentOS sem problemas)