gpt4 book ai didi

java - MDC 无法与 Log4j 正常工作

转载 作者:行者123 更新时间:2023-11-30 07:54:53 25 4
gpt4 key购买 nike

嗨,我想在日志模式中显示登录的用户 ID、主机名、IP 地址等。我正在使用 log4j 来实现同样的目的。我正在使用MDC。在我的主 Controller 中,我能够看到具有指定模式的日志,但在其他文件日志中我无法看到该模式,是否就像我在某些 session 中设置了 MDC 并将上下文值再次放入其他 Controller 中一样?请提出建议。

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

我还有其他不同的 Controller 。现在,主 Controller 内的记录器语句正在日志模式中显示上下文信息,但在其他 Controller 的其他日志消息中,它不显示上下文信息。

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

最佳答案

MDC 属性将是“每个线程”。如果两个 Controller 不共享同一线程,那么它们将不具有 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>

通过执行上述操作,每个 Controller /servlet/端点都将具有您想要的 MDC 属性。

祝你好运!

关于java - MDC 无法与 Log4j 正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32797206/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com