Capturando nova saída após excluir o arquivo de saída

3

Eu estou executando um servidor java no Debian com este comando:

  java -jar myapp.jar [args] >> log.txt

Uma vez eu gzipped o arquivo de log para enviá-lo e, em seguida, percebi que o arquivo original foi embora, deixando-me com apenas o .gzip.

Embora eu tenha criado o arquivo manualmente (e também tentei descompactar o original), o aplicativo não registrou mais esse arquivo. Então, minhas perguntas são: para onde vai esse registro depois disso? Existe alguma maneira de reencaminhar o arquivo de log de saída sem reiniciar o aplicativo (como é um servidor, eu prefiro não matar o processo).

    
por rMaero 20.01.2012 / 16:38

2 respostas

3

De man gzip :

 -k, --keep        Keep (don't delete) input files during compression or
                   decompression.

Então, gzip -k log.txt deve fazer o truque.

(Mas geralmente, uma solução de log real , isto é, um daemon syslog , talvez usando log4j , poderia ser preferível.

    
por 20.01.2012 / 16:51
4

gzip removeu o arquivo log.txt enquanto o processo Java ainda o mantinha aberto. Removendo um arquivo, na verdade, significa remover um nome desse arquivo. (Quando um arquivo tem vários nomes, diz-se que ele tem vários links físicos .) Os dados do arquivo são excluídos apenas quando todos os nomes dos arquivos foram removidos e o arquivo não está aberto por nenhum processo. Então, depois que o arquivo desapareceu, ele ainda estava no disco; o arquivo só foi removido quando o processo Java saiu ou fechou o arquivo.

Observe que o processo Java ainda está gravando no arquivo agora excluído. Não importa se você cria um novo arquivo com o mesmo nome: esse é um arquivo diferente.

Se um arquivo não tiver mais nenhum nome, na maioria dos unices você não poderá recriar um link físico para ele, mesmo que o arquivo ainda esteja aberto. Havia um patch proposto para apresentar uma chamada de sistema flink para fazer isso no Linux, mas foi abatido .

Você ainda pode ler o conteúdo do arquivo (convenientemente no Linux, e talvez menos convenientemente na maioria dos unices). O diretório /proc/1234/fd em que 1234 é o PID do processo Java contém links simbólicos para os arquivos que o processo abriu. Se um desses arquivos for excluído, o link simbólico ficará pendente, mas ainda poderá ser aberto para leitura.

Isso permitirá que você extraia todas as linhas de registro do processo. Executar

tail -c +$(($(zcat log.txt.gz | wc -c) + 1)) -f </proc/1234/fd >more-log.txt

até o processo Java ter morrido.

    
por 21.01.2012 / 01:00