当前位置: 首页 > 知识库问答 >
问题:

MDC与Log4j不能正常工作

糜俊彦
2023-03-14

嗨,我想在日志模式中显示登录的用户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();
    }

我还有其他不同的控制器。现在,主控制器中的logger语句在日志模式中显示上下文信息,但在其他控制器中的其他日志消息中,它没有显示上下文信息。

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

共有1个答案

韶亮
2023-03-14

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/endpoint都将具有所需的MDC属性。

祝你好运!

 类似资料:
  • 我正试图在按下某个按钮时弹出一个警报对话框。我首先使用了Android Developer的示例代码而不是'这不起作用,所以我根据在这个站点上发现的情况进行了更改,但是现在我的程序在按下按钮后被迫停止。 就你的知识而言,这是在第二个不同于主要的活动中完成的。不确定这是否重要.... ‘ 碰撞日志:“03-25 19:34:24.373:E/AndroidRuntime(18828):致命异常:ma

  • 2,错误{org.apache.directory.server.LDAP.ldapserver}-ERR_171无法将LDAP服务(10,389)绑定到服务注册表。java.net.BindException:已在使用的地址 请帮忙谢谢 --------提示------------------- JAVA_HOME环境变量设置为/opt/java CARBON_HOME环境变量设置为/mnt/1

  • 请大家对我的问题解释如下。 我的java web应用程序使用org.apache.log4j. Logger库。 我把这样的命令:log.info("这是log4j输出") 我又放了一个类似S的命令ystem.out.println("这是system out put") 好的,我通过tomcat服务器部署Web应用程序。 现在,我正在跟踪catalina的日志。出来我的问题是: 在应用程序运行期

  • 我正在尝试使用Micrometer从我的spring boot应用程序中公开度量。 以下配置由于某种原因不起作用: spring说: 但是对于完全相同的注释配置,它可以很好地工作: 日志说: 完整的示例如下:https://filebin.net/gjxnwwksaqs1x8zg

  • 我正在做一个类似生存的游戏,我有两种类型的碰撞,一种是玩家的敌人,另一种是敌人身上的子弹。我也有一个健康栏,由于某些原因,在picbox被移除后,健康仍然下降,就像敌人与玩家互动一样。 这是子弹碰撞代码的一个块(所有8个方向的所有代码都是相同的) 这是敌方与玩家碰撞的暗号

  • 有人知道如何使用log4j的配置XML为MDC中缺少的条目指定默认值吗?我在XML文件中定义了一个appender,如下所示: 有问题的部分是来自MDC的订单ID(%x{orderID})。我四处搜索,只找到了相同线程的重复部分,内容类似于$${orderid:-defaultValue},但这在此上下文中不起作用。当在没有订单ID的上下文中接收到日志消息时,我需要能够将该值默认为0或-1或其他一