2010-02-04 6 views
5

Quel enregistreur est-ce que je liste dans mon fichier log4j.xml pour intercepter les exceptions non gérées 2?Log4j Logger for Struts 2 Intercepteur d'exception

Je le code suivant déclaré dans mon struts.xml:

<package name="default" extends="struts-default"> 
    <interceptor-stack name="defaultStack"> 
     <interceptor-ref name="timer"/> 
    <interceptor-ref name="logger"/> 
     <interceptor-ref name="exception"> 
      <param name="logEnabled">true</param> 
      <param name="logCategory">error.unhandled</param> 
      <param name="logLevel">WARN</param> 
     </interceptor-ref> 
    </interceptor-stack> 
</package> 

Dans mon dossier log4j.xml, j'ai l'enregistreur suivant déclaré:

<appender name="CONSOLE" class="org.apache.log4j.ConsoleAppender"> 
    <layout class="org.apache.log4j.PatternLayout"> 
     <param name="ConversionPattern" value="%p [%c] - %C{1}.%M(%L) | %m%n"/> 
    </layout> 
</appender> 
<logger name="error.unhandled"> 
    <level value="DEBUG"/> 
    <appender-ref ref="CONSOLE" /> 
</logger> 

Cependant, lorsque Struts jette un exception, il n'est pas correctement enregistré par log4j. Je sais que mon fichier log4j.xml est analysé correctement car je peux créer manuellement une classe Java avec un enregistreur appelé "error.unhandled" et y écrire des messages de niveau ERROR. Un collègue a également suggéré que je devrais essayer de piéger le log4j.logger.error.unhandled logger mais cela ne fonctionnait pas non plus.

Quel enregistreur Struts 2 utilise-t-il pour l'intercepteur d'exceptions?

+0

Pouvez-vous enregistrer manuellement quelque chose au niveau WARN et l'afficher dans le journal? – skaffman

+0

Quel type de conteneur déployez-vous? (c'est-à-dire Tomcat, JBoss, WebSphere) –

Répondre

0

Vous utilisez le paramètre WARN du niveau de journalisation dans la définition de votre intercepteur. Changez cela en erreur et vous verrez les messages du journal, ou bien réduisez le niveau de l'enregistreur à WARN, INFO ou DEBUG dans le fichier log4j.xml. En d'autres termes, l'intercepteur envoie un message au niveau WARN, l'appender console reçoit ce message mais choisit pour ne pas l'imprimer car il est configuré pour imprimer uniquement les messages au niveau ERROR.

+0

J'ai réduit le niveau d'erreur jusqu'à DEBUG, mais cela n'a pas aidé. D'autres idées? – David

+0

Struts utilise la journalisation des communs, alors peut-être que votre problème est ailleurs. Est-ce que commons-logging et log4j sont configurés correctement? – Yoni

+0

Où dois-je configurer commons-logging? J'ai seulement configuré log4j.xml – David

0

Votre enregistreur dans log4.xml a son seuil défini sur ERROR, donc tout ce qui est enregistré en dessous de ce niveau ne sera pas enregistré. La configuration de votre Struts est configurée pour se connecter au niveau WARN, ce qui est inférieur à ERROR.

Vous devez probablement réduire le seuil dans log4j.xmllogger à WARN, afin d'obtenir n'importe quoi.

+0

J'ai baissé le niveau d'erreur jusqu'à DEBUG, mais ça n'a pas aidé. D'autres idées? – David

4

Ce que vous voulez faire est de fournir des paramètres pour l'intercepteur d'exception dans la pile d'intercepteurs par défaut. Dans l'exemple affiché en question, vous redéfinissez la pile par défaut.

Solution est tirée de wiki officiel: https://cwiki.apache.org/WW/exception-handling.html

Pour activer la journalisation des exceptions étant traitées par le Struts 2 cadre vous devez spécifier certaines valeurs de paramètres dans struts.xml.

<interceptors> 
    <interceptor-stack name="appDefaultStack"> 
    <interceptor-ref name="defaultStack"> 
    <param name="exception.logEnabled">true</param> 
    <param name="exception.logLevel">ERROR</param> 
    </interceptor-ref> 
</interceptor-stack> 
</interceptors> 

<default-interceptor-ref name="appDefaultStack" />