2015-09-26 1 views
1

Salut Je souhaite afficher l'ID utilisateur, le nom d'hôte, l'adresse IP, etc. connectés dans le modèle de journal. J'utilise log4j pour le même. J'utilise MDC. Dans mon contrôleur principal, je suis capable de voir le journal avec le motif specied mais dans l'autre fichier, je ne suis pas en mesure de voir le motif, est-ce comme si j'avais défini le MDC dans une session et mettre la valeur de contexte dans d'autres contrôleurs? Veuillez nous suggérer.MDC ne fonctionne pas correctement avec Log4j

log4j.properties

log4j.rootLogger=INFO,CONSOLE,R 
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender 
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout 
log4j.appender.CONSOLE.layout.ConversionPattern=%5p [%t] (%F:%L) - %m%n 
log4j.appender.R=org.apache.log4j.RollingFileAppender 
log4j.appender.R.File=C:/Logs/Test.log 
log4j.appender.R.ImmediateFlush=true 
log4j.appender.R.Append=true 
log4j.appender.R.MaxFileSize=10MB 
log4j.appender.R.MaxBackupIndex=10 
log4j.appender.R.layout=org.apache.log4j.PatternLayout 
log4j.appender.R.layout.ConversionPattern=%d %X{ipAddress} %X{hostName} %X{Asif}- %c - %p - %m%n 

--------------------------------- 
MainController.java 
try { 
     MDC.put("Asif", "Asif"); 
     MDC.put("ipAddress", request.getRemoteAddr()); 
     MDC.put("hostName", request.getServerName()); 
     logger.info("Context Info : " + MDC.get("userId")+MDC.get("ipAddress")+MDC.get("hostName")); 

    } finally { 
     MDC.remove("ipAddress"); 
     MDC.remove("hostName"); 
     MDC.remove("Asif"); 
     MDC.clear(); 
    } 

J'ai d'autres différents contrôleurs aussi bien. Maintenant, l'instruction du consignateur dans le contrôleur principal affiche les informations de contexte dans le modèle de journal, mais dans les autres messages de journal d'un autre contrôleur, il n'affiche pas les informations de contexte.

ma question. 1. Dois-je ajouter les informations de contexte dans tous les contrôleurs? 2. Y a-t-il une meilleure approche? 3. Est-ce qu'il me manque quelque chose?

Répondre

0

Les attributs MDC seraient 'par thread'. Si deux contrôleurs ne partagent pas le même thread, ils n'auront pas les attributs MDC - ce qui est le cas que vous décrivez.

Essayez les solutions suivantes.

Créer un filtre:

public class MDCFilter implements Filter { 
     @Override 
     public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { 
     try { 
      MDC.put("Asif", "Asif"); 
      MDC.put("ipAddress", request.getRemoteAddr()); 
      MDC.put("hostName", request.getServerName()); 
      chain.doFilter(request, response); 
     } finally { 
      MDC.remove("ipAddress"); 
      MDC.remove("hostName"); 
      MDC.remove("Asif"); 
      MDC.clear(); 
     } 
    } 
} 

carte ensuite à tous les servlets (web.xml)

<filter> 
    <filter-name>MDCFilter</filter-name> 
    <filter-class>{your package}MDCFilter</filter-class> 
</filter> 
<filter-mapping> 
    <filter-name>MDCFilter</filter-name> 
    <url-pattern>/*</url-pattern> 
</filter-mapping> 

En faisant ce qui précède, chaque contrôleur/servlet/point final auront le MDC vous attribue envie.

Bonne chance!

+0

Merci beaucoup Carrilo. –

+0

Avez-vous la configuration Java pour le même au lieu de web.xml dans Spring MVC? –

+0

@WebFilter (urlPatterns = {"/ *"}, description = "Filtre MDC") ajoutez-le à la classe de filtre et scannez-le. –