Eu tenho um script simples que gera vários logs para a tela e canalizei o STDOUT para um arquivo para armazenar os logs. Como esse script é de longa duração, eu precisava rotacionar os arquivos de log para que eles sejam divididos em arquivos menores e mais gerenciáveis.
O problema que enfrentei foi que, uma vez que o logrotate
arquivo de log atual é movido para um novo, o arquivo de log recém-criado não é mais preenchido com os logs. Parece que, assim que o arquivo de log original é removido, seu manipulador de arquivos é perdido e o redirecionamento não funciona mais.
Eu também encontrei este post que tinha o mesmo problema que eu e afirma que ele pode ser corrigido usando em >>
vez de >
redirecionar a saída. Testei sua solução, mas não funcionou para mim. Alguém tem alguma idéia de como manter o redirecionamento funcionando?
Respostas:
Você deve usar a diretiva copytruncate em sua configuração de logrotate para este arquivo de log.
fonte
compress
operação, os dados são duplicados. Isso nos causou um problema uma vez, mas esse foi nosso problema, já que não deveríamos estar tão perto dolv
limite de espaço. Além disso, conforme declarado noman
trecho, você pode perder alguns dados de log entre as operações de cópia e truncar.Como alternativa, você também pode:
use o utilitário logger em seu script em vez de canalizar, com um recurso dedicado (por exemplo, local5), por exemplo:
logger -p local5.info -t myscriptname "this is some log data"
configure o syslog para gravar esse recurso no arquivo de log desejado, exemplo (rsyslog.conf):
local5.* /var/log/mylogfile
configurar a regra de rotação de log para este log.
fonte
echo
. A saída de ferramentas de terceiros que são chamados a partir do script e também de saída algo não pode ser redirecionado para o logger desta formaOutra alternativa à solução Iain é usar um
postrotate
script para reiniciar seu script depois que a rotação ocorrer. Isso é feito para muitos daemons (reinicie ou recarregue o daemon), mas sem conhecer seu script, não sei se essa solução será adequada ou não (seu script depende de algum estado gerado há algum tempo?).Conteúdo de
/etc/logrotate.d/your-script-name
:fonte
Você pode canalizar o stdout para "dividir" (parte dos coreutils no linux). Ele permite que você divida o arquivo / stdin em partes com base no tamanho, número de linhas, etc. Depois de obtê-las, você pode gerenciá-las com logrotate, se necessário.
fonte