Disons que vous attrapez une exception et obtenez ce qui suit sur la sortie standard (comme, par exemple, la console) si vous faites un 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)
Maintenant, je veux envoyer ceci à la place à un enregistreur comme, par exemple, log4j pour obtenir ce qui suit:
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)
Comment puis-je faire ceci?
try {
...
} catch (Exception e) {
final String s;
... // <-- What goes here?
log.error( s );
}
java
logging
log4j
stack-trace
SyntaxeT3rr0r
la source
la source
log.error(e.getLocalizedMessage(), e)
ce qui est totalement redondant. Gère-t-il un null pour le premier argument?log4j-1.2.8.jar
et je voulais tout imprimerstackTrace
sur mon fichier journal, j'ai donc essayé comme ci-dessus, mais j'imprime uniquement sur mon fichier journalnullPointerException
. J'ai été utilisé sur mon code,e.printStackTrace()
il imprime toute trace. Pourquoi ce Kolavery?Si vous souhaitez enregistrer un stacktrace sans impliquer une exception, procédez comme suit:
la source
Vous pouvez également obtenir la trace de la pile sous forme de chaîne via
ExceptionUtils.getStackTrace
.Voir: ExceptionUtils.java
Je l'utilise uniquement pour
log.debug
, pour resterlog.error
simple.la source
Tout simplement parce que cela m'est arrivé et peut être utile. Si tu fais ça
vous obtiendrez l'en-tête de l'exception et non l'intégralité du stacktrace. Parce que l'enregistreur pensera que vous passez une chaîne. Faites-le sans
{}
comme le dit skaffmanla source
Throwable.toString()
ne renvoie pas de trace de pile. (En supposant que vous utilisez un enregistreur qui sait quoi faire avec '{}'.)La réponse de skaffman est certainement la bonne réponse. Toutes les méthodes de l' enregistreur tels que
error()
,warn()
,info()
,debug()
prennent Throwable comme second paramètre:Cependant, vous pouvez également extraire stacktrace sous forme de chaîne. Parfois, cela peut être utile si vous souhaitez profiter de la fonctionnalité de mise en forme en utilisant l'espace réservé "{}" - voir la méthode
void info(String var1, Object... var2);
Dans ce cas, disons que vous avez un stacktrace sous forme de chaîne, alors vous pouvez faire quelque chose comme ceci:Cela affichera le message paramétré et le stacktrace à la fin de la même manière que pour la méthode:
logger.error("error: ", e);
En fait, j'ai écrit une bibliothèque open source qui a un utilitaire pour l'extraction d'un stacktrace en tant que chaîne avec une option pour filtrer intelligemment certains bruits de stacktrace. C'est-à-dire que si vous spécifiez le préfixe de package qui vous intéresse, votre stacktrace extrait serait filtré de certaines parties non pertinentes et vous laisserait des informations très détaillées. Voici le lien vers l'article qui explique les utilitaires de la bibliothèque et où l'obtenir (à la fois comme artefacts maven et sources git) et comment l'utiliser également. Bibliothèque Java Open Source avec filtrage de trace de pile, analyse de Silent String, convertisseur Unicode et comparaison de version Voir le paragraphe " Filtre de bruit Stacktrace "
la source
Cette réponse peut ne pas être liée à la question posée mais liée au titre de la question.
OU
OU
la source
Dans Log4j 2, vous pouvez utiliser Logger.catching () pour enregistrer un stacktrace à partir d'une exception qui a été interceptée.
la source
ce serait une bonne journalisation des erreurs / exceptions log4j - lisible par splunk / autre journalisation / surveillance s / w. tout est forme de paire clé-valeur. log4j obtiendrait la trace de la pile à partir de l'obj d'exception
e
la source
la source
Vous pouvez utiliser le code ci-dessous:
Ici, vous pouvez simplement appeler:
LogWriterUtility.errorWithAnalysis( YOUR_EXCEPTION_INSTANCE);
Il imprimera stackTrace dans votre journal.
la source
Créez ceci
class
:Appelez ça dans votre code
la source