67 votes

log4j n'imprime pas le stacktrace pour les exceptions

J'utilise log4j avec tomcat. Lorsque je consigne des exceptions dans mes JSP, les servlets:

 private Logger _log = Logger.getLogger(this.getClass());
...
try{...} catch (Exception e) {
    _log.error("Error refreshing all prices", e);
}
 

Je ne reçois que la première ligne de l'exception, sans stacktrace.

17 février 2008 17:37:45 ERREUR AutoContrib: 175 - Exception lors de la publication du fichier csv: java.lang.ArrayIndexOutOfBoundsException

Pas très utile du tout!

Mon fichier log4j.properties (/tomcat/common/classes/log4j.properties) ressemble à ceci:

 log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{dd-MMM HH:mm:ss} %5p %c{1}:%L - %m%n
log4j.appender.stdout.threshold=info

log4j.appender.file=org.apache.log4j.RollingFileAppender
log4j.appender.file.maxFileSize=5000KB
log4j.appender.file.maxBackupIndex=10
log4j.appender.file.File=${catalina.home}/logs/web.log
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{dd-MMM HH:mm:ss} %5p %c{1}:%L - %m%n
log4j.appender.file.threshold=info

log4j.rootLogger=debug, stdout, file
 

78voto

minimo Points 346

En fait, c'est probablement dû à un hotspot d'optimisation: après un certain nombre de la même exception levée, il arrête l'impression de sortir de la trace. Cette fonction peut être désactivée avec une machine virtuelle, arg, voir:

À partir de http://java.sun.com/j2se/1.5.0/relnotes.html :

Le compilateur dans le serveur VM offre désormais correcte de la pile backtraces pour tous les "à froid" des exceptions intégrées. Pour plus de performances, lors de l' une telle exception est levée un peu de temps, la méthode peut être recompilé. Après recompilation, le compilateur peut choisir une plus tactique à l'aide de préaffectés exceptions qui ne fournissent pas de trace de la pile. Pour désactiver complètement de l'utilisation de préaffectés exceptions, l'utilisation de ce nouveau drapeau: -XX:-OmitStackTraceInFastThrow.

Plus ici:

http://jawspeak.com/2010/05/26/hotspot-caused-exceptions-to-lose-their-stack-traces-in-production-and-the-fix/

22voto

objects Points 6137

Ce que vous avez posté devrait afficher la trace de la pile comme indiqué dans le javadoc .

Notez que si vous n'incluez pas de message (et appelez simplement logger.error (ex)), le suivi de la pile n'est pas enregistré.

1voto

Luhar Points 1014

Je n'ai pas utilisé l'appel fillStackTrace, je ne peux donc pas dire si cela fonctionnera. Une autre approche consiste à utiliser une petite méthode qui renvoie le texte mis en forme à partir d'une exception.

 public static String getStackTrace(Exception e)
{
    StringWriter sWriter = new StringWriter();
    PrintWriter pWriter = new PrintWriter(sWriter);
    e.printStackTrace(pWriter);
    return sWriter.toString();
}
 

Dans votre code de connexion, vous pouvez écrire:

 logger.error("An exception occurred: " + Utils.getStackTrace(e));
 

1voto

Bozho Points 273663

Je ne vois aucun problème avec votre configuration, essayez donc de mettre à niveau log4j vers une version plus récente (pas nécessairement la dernière).

Bien que ce ne soit pas le problème dans ce cas, vous feriez mieux de faire de vos enregistreurs private static final

-1voto

Buhake Sindi Points 38654

En utilisant votre exemple de code:

 private static final Logger _log = Logger.getLogger(MyClass.class);
...
try{...} catch (Exception e) {
    //Change
    //_log.error("Error refreshing all prices", e);

   //To
    _log.error("Error refreshing all prices", e.fillInStackTrace());
}
 

Vous verrez toute la trace de la pile affichée.

PS Faites de Logger un singleton ... (vérifiez ma déclaration) juste après avoir déclaré public class MyClass {

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X