Eu tenho um programa Linux que pode gravar informações em stdout e stderr.
Eu tenho um script de shell que redireciona essa saída para um arquivo /var/log
. (Via >>
e 2>&1
.)
Existe uma maneira de fazer esse arquivo de log girar? (tamanho máximo, depois mude para um arquivo diferente, mantenha apenas um número limitado de arquivos)
Eu já vi algumas respostas que falam sobre o logrotate
programa, o que parece bom, mas também parecem focadas em programas que estão gerando arquivos de log internamente e lidam com sinais HUP. Existe uma maneira de fazer isso funcionar com um script de redirecionamento de saída básico?
logrotate
se houver uma opção melhor, que soou como um ponto de partida conveniente para discussão.Respostas:
Como alternativa, você pode canalizar a saída através de ferramentas projetadas com o objetivo principal de manter conjuntos de arquivos de log com limite de tamanho e rotação automática, como:
multilog
de daemontoolsmultilog
de daemontools-encores6-log
de s6svlogd
de runittinylog
de perpcyclog
de noshAs ferramentas para processar
multilog
conjuntos de arquivos de log de formato incluem, entre outros:multilog-watch
logrange
multilog-stamptail
follow-log-directories
de noshexport-to-rsyslog
de noshLeitura adicional
logrotate
ounewsyslog
neste século. . Respostas dadas com freqüência.fonte
multilog
parece exatamente o que eu precisava.multilog
nenhum lugar cria ou exige vínculos simbólicos. É totalmente neutro em relação a eles.a
rotatelogs
ferramenta fornecida com o apache (nobin
diretório) (consulte docs ) recebe a entrada do stdin e gira o log após um período específico de tempofonte
Se você puder acessá-lo em um dos fluxos de logs padrão (syslog, daemon, cron, usuário, segurança, correio etc.), poderá usar o
logger
comando e canalizar para ele.Caso contrário, é melhor canalizar o conteúdo registrado para um programa ou script personalizado para lidar com isso ou verificar a
logrotate
configuração.EDIT: A resposta do JdeBP parece ter o que você pode estar procurando.
fonte
Eu tive um problema semelhante e inicialmente descartei o logrotate, mas acabou que o logrotate pode realmente fazer isso bem, a diretiva-chave é " copytruncate ". Por alguma razão, esse termo não apareceu em nenhum dos artigos que eu escrevi, por isso estou adicionando esta resposta para esclarecer exatamente como usá-lo neste caso.
O truque é que isso só funciona se o redirecionamento for feito com " >> " (anexar) em vez de " > " (criar).
Arquivo de configuração (truncate.cfg):
Programa de teste (nunca desiste de arquivo). Você pode vê-lo preenchendo o disco e, embora a exclusão do arquivo de log pareça funcionar, ele não liberará espaço no disco:
Rodar log de execução:
fonte
echo /dev/urandom >> /tmp/temp.log
gravará 13 caracteres determinísticos/tmp/temp.log
e sairá imediatamente. Você quis dizercat /dev/urandom
?Sim! Confira a diretiva "copytruncate" oferecida pelo logrotate. Especificando que instrui o logrotate para lidar com essa mesma situação: um programa simples que mantém seu arquivo de log aberto indefinidamente.
Uma ressalva pode ou não ser um problema na sua situação:
Curiosamente, eu vi algumas fontes de log do "mundo real" que incentivam os usuários a aplicar esta diretiva. Há alguma discussão sobre essa opção aqui .
fonte
Use split, faz parte do coreutils. Pode pegar o stdin e dividi-lo em pedaços (com base no tamanho do pedaço ou no número de linhas, etc.).
Exemplo:
Nota dash (-) instrui "split" para usar stdin em vez de arquivo.
fonte
split
houver dados no que poderia ser um buffer grande. Dado que existem várias ferramentas que resolvem esse problema adequadamente, não acho que esse tipo de solução faça seu próprio roll-on possa ser recomendado.Gosto
multilog
do meu caso de uso, mas meu caso de uso é tão trivial / simples que não é apresentado de maneira muito simples nos documentos / exemplos que encontrei. Aqui está um exemplo simples de rotação múltipla:Algumas notas:
"Note that running processor may block any program feeding input to multilog."
onde 'processador' é a'!tai64nlocal'
parte do comando* Para muitas aplicações, essas são escolhas ruins para uso a longo prazo. Eles permitem observar o comportamento de preencher e girar os logs mais rapidamente do que os grandes.
Finalmente, não se esqueça de usar o nohup, se necessário! Com nohup, você não precisa de
2>&1
(s = 10e6 en = 30 aqui):Esse comando deve começar.
fonte
Eu só queria adicionar ao comentário de Sam Hendley acima:
O truque é que isso só funciona se o redirecionamento for feito com
>>
(acrescentar) em vez de>
(criar).Corri para o mesmo problema em que o arquivo original continua crescendo se você usar
>
(criar), mas se você usar>>
(acrescentar) o Logrotate copytruncate funciona perfeitamente e conforme o esperado. O arquivo original volta para zero bytes e o programa continua gravando.Redirecione STDOUT e STDERR para um arquivo de log rotativo:
some-program.sh >> /tmp/output.txt 2>&1 &
Crie um arquivo de configuração de logrotate
/etc/logrotate.d
chamado de qualquer coisa, output_roll no meu caso.Exemplo de configuração para o meu caso:
Configure seu trabalho cron dentro do
/etc/crontab
arquivoIsso verificará o arquivo a cada minuto. Você pode ajustar para atender às suas necessidades.
Inicie:
É isso aí
Nota: Eu também tive um problema com o SELinux sendo definido como
SELINUX=enforcing
definidoSELINUX=disabled
.fonte
Eu escrevi um logrotee neste fim de semana. Provavelmente, não leria se tivesse lido a ótima resposta e o @ JdeBP
multilog
.Eu me concentrei em ser leve e poder bzip2 seus pedaços de saída como:
Ainda há muito a ser feito e testado.
fonte