Digamos que você tenha capturado uma exceção e obtenha o seguinte na saída padrão (como, por exemplo, o console) se você fizer um e.printStackTrace () :
java.io.FileNotFoundException: so.txt
at java.io.FileInputStream.<init>(FileInputStream.java)
at ExTest.readMyFile(ExTest.java:19)
at ExTest.main(ExTest.java:7)
Agora, quero enviar isso para um logger como, digamos, log4j para obter o seguinte:
31947 [AWT-EventQueue-0] ERROR Java.io.FileNotFoundException: so.txt
32204 [AWT-EventQueue-0] ERROR at java.io.FileInputStream.<init>(FileInputStream.java)
32235 [AWT-EventQueue-0] ERROR at ExTest.readMyFile(ExTest.java:19)
32370 [AWT-EventQueue-0] ERROR at ExTest.main(ExTest.java:7)
Como posso fazer isso?
try {
...
} catch (Exception e) {
final String s;
... // <-- What goes here?
log.error( s );
}
java
logging
log4j
stack-trace
SintaxeT3rr0r
fonte
fonte
log.error(e.getLocalizedMessage(), e)
que é totalmente redundante. Ele lida com um nulo para o primeiro argumento?log4j-1.2.8.jar
e queria imprimir tudostackTrace
no meu arquivo de log, então tentei como você mencionou acima, mas está imprimindo apenas no meu arquivo de lognullPointerException
. Eu fui usado no meu códigoe.printStackTrace()
que imprime todos os rastreamentos. Por que esse Kolavery?Se você deseja registrar um rastreamento de pilha sem envolver uma exceção, faça o seguinte:
fonte
Você também pode obter o rastreamento de pilha como string via
ExceptionUtils.getStackTrace
.Consulte: ExceptionUtils.java
Eu o uso apenas para
log.debug
, para manter alog.error
simplicidade.fonte
Só porque aconteceu comigo e pode ser útil. Se você fizer isto
você receberá o cabeçalho da exceção e não o rastreamento de pilha inteiro. Porque o criador de logs pensará que você está passando uma String. Faça isso
{}
como skaffman dissefonte
Throwable.toString()
não retorna um rastreamento de pilha. (Supondo que você está usando um registrador de que sabe o que fazer para com '{}'.)A resposta de skaffman é definitivamente a resposta correta. Todos os métodos logger, como
error()
,warn()
,info()
,debug()
tomar Throwable como um segundo parâmetro:No entanto, você pode extrair o stacktrace como uma String também. Às vezes, pode ser útil se você deseja tirar proveito do recurso de formatação usando o marcador de posição "{}" - consulte o método
void info(String var1, Object... var2);
Nesse caso, diga que você tem um rastreamento de pilha como String, então pode realmente fazer algo assim:Isso imprimirá a mensagem parametrizada e o rastreamento de pilha no final da mesma maneira que no método:
logger.error("error: ", e);
Na verdade, eu escrevi uma biblioteca de código aberto que possui um utilitário para extração de um stacktrace como uma String, com a opção de filtrar com inteligência o ruído do stacktrace. Ou seja, se você especificar o prefixo do pacote que está interessado no seu rastreamento de pilha extraído, será filtrado de algumas partes irrelevantes e o deixará com informações muito importantes. Aqui está o link para o artigo que explica quais utilitários a biblioteca possui e onde obtê-lo (como artefatos maven e fontes git) e como usá-lo também. Biblioteca Java de código aberto com filtragem de rastreamento de pilha, conversor Unicode de análise de string silenciosa e comparação de versões Consulte o parágrafo " Filtro de ruído Stacktrace "
fonte
Esta resposta pode não estar relacionada à pergunta, mas relacionada ao título da pergunta.
OU
OU
fonte
No Log4j 2, você pode usar Logger.catching () para registrar um rastreamento de pilha de uma exceção que foi capturada.
fonte
isso seria bom log4j log de erro / exceção - legível por splunk / outro log / monitoramento s / w. tudo é forma de par de valor-chave. log4j obteria o rastreamento de pilha da exceção obj
e
fonte
fonte
Você pode usar o código abaixo:
Aqui você pode simplesmente ligar para:
LogWriterUtility.errorWithAnalysis( YOUR_EXCEPTION_INSTANCE);
Ele imprimirá o stackTrace no seu log.
fonte
Crie isto
class
:Chame isso em seu código
fonte