1

您好我想在日志模式中显示登录的用户 ID、主机名、IP 地址等。我也在使用 log4j。我正在使用 MDC。在我的主控制器中,我可以看到带有指定模式的日志,但在其他文件日志中我看不到模式,是不是就像我在某个会话中设置了 MDC 并将上下文值再次放入其他控制器中一样?请建议。

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.我错过了什么吗?

4

1 回答 1

1

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 属性。

祝你好运!

于 2015-09-26T13:02:50.063 回答