paulo1205
(usa Ubuntu)
Enviado em 02/05/2013 - 19:27h
Se o programa reabrisse o log automaticamente mediante alguma forma de interação, o
logrotate possivelmente seria a reposta definitiva ao problema. Mas, pelo que você mostrou, você está redirecionando, atrvés do shell, uma saída que seria jogada para o terminal.
Se o programa não lhe oferecer um mecanismo de log interno que funcione melhor do que esse redirecionamento manual, eu vejo três soluções imediadas, cada uma com suas desvantagens.
1) Reiniciar a aplicação periodicamente, gerando a saída para arquivos com timestamps distintos. O problema disso é que parar e reiniciar a aplicação causará downtime e possível interrupção de operações em andamento, o que pode ser inaceitável.
2) Redirecionar a saída para um pipe, e ter como receptor desse pipe um programa que rotacione periodicamente o arquivo de saída ou que aceite uma forma de comunicação que permita rotacionar os arquivos assincronamente. A desavantagem é que se o processo com o receptor capotar por algum motivo, não será possível recuperar a saída do pipe com algum outro processo, e pode ser que a aplciação, ao tentar escrever no pipe que não tem mais um recpetor, pode receber um SIGPIPE, que, se não for ignorado, a fará capotar.
3) Redirecionar o log para um FIFO (named pipe), e ter um outro processo lendo desse fifo e se encarregando de encaminhar os logs para arquivos que podem ser, como no caso anterior, rotacionados periódicamente ou assíncronamente. Também como no caso anterior, se o processo que lê o FIFO cair e o transmissor tentar escrever, o transmissor pode tomar um SIGPIPE e morrer. A vantagem, porém, é que é possível reconectar-se ao FIFO como receptor se o receptor original cair, de modo que, se a queda for curta, pode ser que o transmissor nem mesmo a perceba. Além disso, dependendo da aplicação, ela pode ignorar o SIGPIPE (ou você pode fazer com que o shell o ignore antes de disparar a aplicação), mas deve saber que as mensagens de log que eventualmente forem escritas enquanto o receptor estiver caído vão se perder, mesmo que o transmissor não chegue a cair.
Numa máquina normal, é óbvio que nem o transmissor nem o receptor deveriam cair, de modo que as soluções (2) e (3) deveriam lhe atender.