2015-09-26 184 views
1

您好我想在日志模式中显示登录的用户ID,主机名,IP地址等。我使用相同的log4j。我正在使用MDC。在我的主控制器中,我能够看到具有指定模式的日志,但在其他文件日志中,我无法查看模式,是否像我在某个会话中设置了MDC,并将上下文值再次放入其他控制器中? 请建议。MDC不能正常工作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(); 
    } 

我有其他不同的控制器以及。现在,主控制器内的记录器语句以日志模式显示上下文信息,但在其他控制器的其他日志消息中显示上下文信息,而不显示上下文信息。

我的问题。 1.是否需要在所有控制器中添加上下文信息? 2.有没有更好的方法? 3.我错过了什么?

回答

0

MDC属性是'每个线程'。如果两个控制器不共享相同的线程,那么它们将不具有MDC属性 - 这就是您所描述的情况。

请尝试以下操作。

创建一个过滤器:

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(); 
     } 
    } 
} 

然后映射到所有servlet(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> 

通过做好以上,每个控制器/ servlet的/端点将有MDC你的属性欲望。

祝你好运!

+0

非常感谢Carrilo。 –

+0

在Spring MVC中,您是否具有Java配置而不是web.xml? –

+0

@WebFilter(urlPatterns = {“/ *”},description =“MDC Filter”)将其添加到过滤器类并对其进行扫描。 –