2017-02-09 3 views
1

J'essaie de limiter la profondeur de la pile d'exception quand je suis connecté depuis un endroit spécifique du code. A la suite http://logging.apache.org/log4j/2.x/manual/layouts.html#Pattern_Selectors ma configuration ressemble à ceci (élément clé):Pourquoi cette configuration de MarkerPatternSelector dans Slf4j + Log4j2 ne fonctionne pas?

<PatternLayout> 
    <MarkerPatternSelector defaultPattern="%d{dd MMM yyyy HH:mm:ss,SSS}: %m%n"> 
     <PatternMatch key="ExceptionInterceptor" 
         pattern="%d{dd MMM yyyy HH:mm:ss,SSS}: %m%throwable{5}%n" /> 
    </MarkerPatternSelector> 
</PatternLayout> 

Dans le code Java:

@Slf4j 
public final class ExceptionInterceptor { 
    private static final Marker MARKER = MarkerFactory.getMarker("ExceptionInterceptor"); 

    public void intercept(Throwable t) { 
     log.info(MARKER, "Got exception", t); 
    } 

Et pourtant, pour une raison quelconque le marqueur ne semble pas correspondre, à savoir que je reçois plein pile enregistrée. Lorsque j'ajoute %throwable{5} à l'attribut defaultPattern, la pile est tronquée comme prévu.

Voici le journal DEBUG pertinent au démarrage (timestamps &). Si je le lis correctement, il semble construire le matcher ok.

Building Plugin[name=PatternMatch, class=org.apache.logging.log4j.core.layout.PatternMatch]. Searching for builder factory method... 
Found builder factory method [newBuilder]: public static org.apache.logging.log4j.core.layout.PatternMatch$Builder org.apache.logging.log4j.core.layout.PatternMatch.newBuilder(). 
Calling build() on class class org.apache.logging.log4j.core.layout.PatternMatch$Builder for element PatternMatch with params(, key="ExceptionInterceptor", pattern="%d{dd MMM yyyy HH:mm:ss,SSS}: %m%throwable{5}%n") 
Built Plugin[name=PatternMatch] OK from builder factory method. 
Building Plugin[name=patternSelector, class=org.apache.logging.log4j.core.layout.MarkerPatternSelector]. Searching for builder factory method... 
No builder factory method found in class org.apache.logging.log4j.core.layout.MarkerPatternSelector. Going to try finding a factory method instead. 
Still building Plugin[name=patternSelector, class=org.apache.logging.log4j.core.layout.MarkerPatternSelector]. Searching for factory method... 
Found factory method [createSelector]: public static org.apache.logging.log4j.core.layout.MarkerPatternSelector org.apache.logging. 
log4j.core.layout.MarkerPatternSelector.createSelector(org.apache.logging.log4j.core.layout.PatternMatch[],java.lang.String,boolean,boolean,org.apache.logging.log4j.core.config.Configuration). 

Qu'est-ce qui ne va pas avec ce code au-delà duquel le marqueur ne correspond pas?

Répondre

1

Je suis d'accord avec votre analyse et ne trouve aucun problème avec la configuration. (Merci d'avoir montré l'extrait du journal d'état.)

Vous avez peut-être trouvé un bug. S'il vous plaît soulever ceci sur le traqueur de problème de Log4j2 JIRA. Veuillez mentionner la version de Log4j2 que vous utilisez. (Et si vous n'avez pas essayé avec la dernière version, essayez-le en premier.)

+0

Vous aviez raison. J'utilisais Log4j 2.4, après avoir mis à jour vers 2.6, le problème est parti. Je vous remercie! – alexandroid

+0

Vous voudrez peut-être passer à la version 2.8, car beaucoup, beaucoup de bugs ont été corrigés depuis 2.6 ... :-) –