Gravar e.printStackTrace() em um arquivo

5 respostas
Marques

Lista,

No código abaixo como eu gravo um arquivo contendo o printStackTrace???

Muito obrigado,

Marques

try {
		//trecho gera Exception
		} catch (Exception e) {			
			//Como eu gravo em um arquivo e.printStackTrace() ???
		}

5 Respostas

Arcadex

Use o LOG4J. Essa framework faz tudo pra vc. Atende essa sua necessidade e abrange muito mais. Basta jogar o JAR no classpath da sua aplicação e criar um log4j.properties (arquivo txt com configurações) para ele começar a gerar essas informações p/ vc.

Aí, vc coloca um comando tipo assim:

private static final Logger LOGGER = Logger.getLogger(SuaClasse.class);
.
.
.
try {
 		//trecho gera Exception
 		} catch (Exception e) {			
                        LOGGER.error(" Seu erro no arquivo txt: " + e.printStackTrace());
 			
 		}

Dá uma olhada no exemplo nesse site:
http://www.vipan.com/htdocs/log4jhelp.html

J
public void printStackTrace(PrintStream s)
Prints this throwable and its backtrace to the specified print stream. 

Parameters:
s - PrintStream to use for output
public void printStackTrace(PrintWriter s)
Prints this throwable and its backtrace to the specified print writer. 

Parameters:
s - PrintWriter to use for output
Since: 
JDK1.1

Qualquer coisa dá uma sacada nesses métodos aew da API de Exception

Espero ter ajudado!!
Flw aew e t+!!

Mantu

Tenho algo pronto aqui:

public static boolean setFileContentAsStackTrace(File file, Throwable t, boolean append){
		StringWriter sw = new StringWriter();
		PrintWriter pw = new PrintWriter(sw);
		t.printStackTrace(pw);
		SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy aa hh:mm:ss");
		String text = "\r\n\r\n" + sdf.format(new Date()) + "\r\n" + sw.toString();
		pw.close();
		try {
			sw.close();
		} catch (Exception e) {
		}
		return setFileContentAsText(file, text, append);
	}

	public static boolean setFileContentAsText(File file, String text, boolean append){
		try {
			if(file == null || !file.exists() || !file.isFile())
				throw new FileNotFoundException(file.getAbsolutePath());
			if(text == null)
				text = "";
			
			FileWriter fw = new FileWriter(file, append);
			BufferedWriter bw = new BufferedWriter(fw);
			bw.write(text);
			bw.close();
			fw.close();
			return true;
		} catch (Exception e) {
			return false;
		}
	}
ViniGodoy

Eu uso um uncaughtExceptionHandler para capturar toda e qualquer exceção Runtime que não tenha sido capturada.

Fazer isso é muito fácil. Logo no início do programa faça:

Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
public void uncaughtException(Thread t, Throwable e)
{
        //Aqui vai o código para gravar as exceções Runtime não foram capturadas
});

A vantagem de registrar o UncaugthExceptionHandler é que você pode passar a capturar as exceções específicas, evitando o temível catch em "Exception" (como você fez ali em cima).

Como faço a gravação? Atualmente estou usando o log do próprio Java, do Pacote java.util.logging. Ele não é tão sofisticado quanto o Log4J, mas acho que atende a todas as minhas necessidades de log, além do fato de já ser parte do JDK (não exigindo assim nenhum import de jar e sendo mantido pela própria sun).

Basicamente, para usar o Logger do Java, você faz:

//O log geralmente é um atributo estático da classe.
private static final Logger logger = Logger.getLogger(getClass().getCanonicalName());

//No método onde quero capturar uma exceção verificada faço
try {
   //Faz alguma coisa
}
catch (ExcecaoVerificada e) { 
   //Só capturo exceções obrigatórias, sempre no tipo mais específico
   //As não obrigatórias deixo pro UncaughtExceptionHandler tratar.
   logger.log(Level.SEVERE, e.getMessage(), e);
}

Para fazer o logger gravar num arquivo, você associa ao log um FileHandler. Dê uma pesquisada! É muito fácil de fazer. O FileHandler ainda te dá opção de limitar o tamanho máximo do arquivo de log, de gerar mais de um arquivo quando exceder esse tamanho, etc. Você ainda pode definir nível para o log. Enfim, tudo que se esperaria de um bom logger simples. E, diferente do log4j, não exige arquivo de configurações e nem jar externo.

zap

Eu apoio o amigo que indicou o Log4J.

Vale a pena aprender :thumbup:

Criado 11 de janeiro de 2007
Ultima resposta 11 de jan. de 2007
Respostas 5
Participantes 6