log4j + printStackTrace()

1 resposta
furacao123

tenho uma aplicação Web Start JSE, e gostaria de saber se tem como eu disparar toda mensagem do printstack trace no arquivo de log?

por exemplo, tenho um metodo popula campos de um crud, quando por exemplo vem um registro nulo eu nao consigo abrir a janela de cadastro da empresa, e no try catch disparo o ex.printStackTrace() e me retorna o seguinte exception

java.lang.NullPointerException at gui.crud.handler.cadastro.CadEmpresaHandler.populaCampos(CadEmpresaHandler.java:352) at gui.crud.handler.cadastro.CadEmpresaHandler.<init>(CadEmpresaHandler.java:62) at gui.crud.handler.consulta.ConEmpresaHandler.editar(ConEmpresaHandler.java:166)

onde a linha 352 é o momento em que tento popular o campo da view com os dados da empresa, ae tranquilo, pois vejo na linha do codigo fonte e identifico o valor nulo.

Agora quando trabalho com web start nao tenho o prompt para testar e ver o printStackTrace, entao estou utilizando o log log4j, mas nao consigo jogar esse printstacktrace no log entao fica assim.

} catch(Exception e) { e.printStackTrace(); logger.error(e); }

Arquivo log

ERROR 02/03/2012 15:42:18  [AWT-EventQueue-0]   gui.crud.handler.cadastro.CadEmpresaHandler       :372 - java.lang.NullPointerException

onde 372 nao eh a linha que disparou o null pointer e sim a linha em que estou chamando o logger.error, tenho como trazer no log o printStackTrace()?

1 Resposta

heatcold
/**
* Log an exception stack trace.
* 
* @param ex - <code>Exception</code>
*/
public void logStackTrace(Exception ex) {
	logger.info(ex);
	// Don't use getStackTrace() as it calls clone()
	// Get stackTrace, in case stackTrace is reassigned
	StackTraceElement[] stack = ex.getStackTrace();
	for (int i=0; i<stack.length; i++)
		logger.info("\tat " + stack[i]);
	StackTraceElement[] parentStack = stack;
	Throwable throwable = ex.getCause();
	while (throwable != null) {
		logger.info("Caused by: ");
		logger.info(throwable);
		StackTraceElement[] currentStack = throwable.getStackTrace();
		int duplicates = countDuplicates(currentStack, parentStack);
		for (int i=0; i<currentStack.length - duplicates; i++)
			logger.info("\tat " + currentStack[i]);
		if (duplicates > 0) {
			logger.info("\t... " + duplicates + " more");
		}
		parentStack = currentStack;
		throwable = throwable.getCause();
	}
}

/**
 * Auxiliar method used by logStackTrace(Exception)
 * 
 * @param currentStack - <code>StackTraceElement[]</code>
 * @param parentStack - <code>StackTraceElement[]</code>
 * 
 * @return int
 */
private static int countDuplicates(StackTraceElement[] currentStack, 
		StackTraceElement[] parentStack) {
	int duplicates = 0;
	int parentIndex = parentStack.length;
	for (int i=currentStack.length; --i >= 0 && --parentIndex >= 0;) {
		StackTraceElement parentFrame = parentStack[parentIndex];
		if (parentFrame.equals(currentStack[i])) {
			duplicates++;
		} else {
			break;
		}
	}
	return duplicates;
}
Criado 2 de março de 2012
Ultima resposta 2 de mar. de 2012
Respostas 1
Participantes 2