É engraçado como algumas coisas que parecem simples de resolver acabam nos custando algumas horas de trabalho. Mesmo com toda ajuda do google, achar uma combinação de palavras que resulte em algo satisfatório pode ser difícil. Isso me faz pensar o quanto é dificil estimar tempo de projeto. Confesso que na maior parte das vezes saio compondo um código frankstein pra só depois chegar no veredicto ... e isso leva tempo!
Dessa vez foi a necessidade de direcionar todo contéudo da saída padrão pra um arquivo de log. A razão surgiu quando passei a executar uma aplicação gráfica clicando diretamente no arquivo JAR, deixando a cargo do sistema operacionar bota-la no ar, sem que eu tivesse que digitar qualquer comando (os fanáticos por console que me perdoem, mas certamente a maioria dos clientes não estão interessados em saber qual comando, parâmetro e afins ele ou seu funcionário terá que digitar, afinal já passamos da idade da pedra, certo? Lembre-se "Keep It Simple and Super Stupid"). Ao deixar a cargo do sistema operacional executar a aplicação, fiquei sem acesso a saída padrão do aplicativo, que seria o meu console se estivesse digitado toda a linha de comando para executar a aplicação ao invés de ter clicado no JAR. E adivinhem só o que aconteceu? Lei de Murphy, o aplicativo parou depois de horas em execução e eu fiquei literalmente enrolado, sem saber o que ocorreu. A partir dai tinha duas alternativas, rodar o aplicativo sempre via console ou então direcionar sua saída padrão pra um arquivo de log.
A solução é extremamente simples, principalmente depois que encontramos os caminhos das pedras. Direcionar a saída padrão pra um arquivo ou qualquer outro dispositivo é fácilmente resolvido em uma ou duas linhas de código, bastando simplementes utilizar o método "setOut" e/ou "setErr" da classe "System", passando o novo meio. O código abaixo exemplifica este cenário:
O código acima funciona perfeitamente porém ele nunca mantem o contéudo que existia no arquivo de log. Em muitos casos isso não é um problema, a solução acima atende perfeitamente. Porém, imagine se precisa de um histórico dos erros, horário que o aplicativo foi inicializado, etc, neste caso é fundamental que o contéudo anterior do arquivo seja mantido, correto? Foi exatamente essa necessidade que me fez recorrer aos livros, internet, tutoriais e finalmente na API do pacote java.io. A solução, novamente é ridiculamente simples. O código abaixo demonstra como modificar o código anterior pra que o conteúdo do arquivo de log seja preservado, ou seja, as novas entradas serão adicionadas no final do arquivo.
Pra verificar o funcionamento do exemplo acima, experimente executa-lo mais de uma vez e compare o contéudo do arquivo "arquivo_saida.txt".
Embora a solução de direcionar a saída padrão para um arquivo de log, preservando ou não o conteúdo anterior, seja bastante simples, nem sempre temos todo o conhecimento pronto para implementa-la. Esse post visa ajudar os desesperados por uma solução rápida e também aqueles que desejam estar munidos de uma ferramenta que mais cedo ou mais tarde precisarão. Uma excelente semana a todos!
Referências:
1 - Tutorial Basic IO da Sun/Oracle
2 - API FileOutputStream
3 - API PrintStream
Nenhum comentário:
Postar um comentário