Gire um arquivo aberto e sendo gravado o tempo todo

10

Eu tenho um aplicativo linux que grava continuamente as informações de log em um arquivo de log, por exemplo. /var/log/application.log. Como o aplicativo não gira o arquivo automaticamente, esse arquivo de log pode atingir um tamanho de gigabytes em algumas semanas, então eu quero poder girar esse arquivo corretamente

Minha principal preocupação aqui é que, para rodar um arquivo que é aberto pelo aplicativo o tempo todo, provavelmente terei que:

  1. Mova o arquivo para sua forma rotacionada /var/log/application.log -> /var/log/application.log.2013-01-28

  2. Crie um vazio /var/log/application.log. Obs: Neste ponto, o processo de inscrição ainda está gravando no/var/log/application.log.2013-01-28

  3. Altere o descritor de arquivo do processo do aplicativo para apontar novamente para /var/log/application.log

Então, eu estou certo? Se sim, como posso fazer isso? (principalmente a alteração da parte do descritor de arquivo)

Se não sou, qual é a maneira correta e como fazê-lo?

Bruno Polaco
fonte
Você precisa limpar o arquivo ou apenas girá-lo?
precisa saber é
Qual aplicação? O aplicativo deve fornecer suporte para fazer isso corretamente. (Caso contrário, você pode uma coisa muito feia - anexar ao processo, abra o novo arquivo, dup2o novo descritor sobre o antigo, em seguida, feche o novo descritor.)
David Schwartz
Abordagem interessante Schwartz. Estou curioso para ver isso em ação e vou brincar com ele por um tempo. De qualquer forma, o aplicativo está em casa e estou procurando uma solução mais geral. Gosto da resposta de kormoc btw
Bruno Polaco
@ewwhite eu preciso girá-lo, eu não posso dar ao luxo de perder os dados de registro
de Bruno Polaco

Respostas:

11

Escreva uma logrotateconfiguração para usarcopytruncate

copytruncate
    Truncate the original log file in place after creating a copy, instead of moving the 
    old log file and optionally creating a new one. It can be used when some program
    cannot be told to close its logfile and thus might continue writing (appending) to
    the previous log file forever. Note that there is a very small time slice between
    copying the file and truncating it, so some logging data might be lost. When this
    option is used, the create option will have no effect, as the old log file stays
    in place.
RS
fonte
Interessante, truncar o arquivo após a cópia parece bastante inteligente, mesmo com a margem de perda de dados. Eu não notei essa opção no logrotate. Thx for the insight :) #
227 Bruno Polaco
1

A maioria desses aplicativos responde a um sinal, como SIGHUP, e irá fechar e reabrir seus arquivos de log após a recepção do sinal. Verifique a documentação do seu aplicativo para o sinal correto a ser enviado.

Michael Hampton
fonte
E se isso não acontecer, você pode reiniciar o aplicativo como um substituto. Isso é o que o syslog costuma fazer, e vários outros programas.
lsd