您希望在 log4j 或 slf4j 中查看嵌套诊断上下文或映射的诊断上下文。NDC/MDC 允许您将数据插入到会话中,这些数据可由 log4j 进行筛选。
因此,您可以将用户名定义为位于NDC中,然后可以更改log4j.properties以更改特定用户的日志记录级别。
MDC 使用映射,而 NDC 基于堆栈原理。如果您使用的是 slf4j,您甚至可以根据 MDC 中的信息创建单独的日志文件。
例如,当用户登录网站时,我们这样做。我们想要跟踪特定用户正在执行的操作(追溯性),因此我们将用户名和会话ID添加到NDC,然后我们可以发布过滤器。
代码类似于以下内容:
public class LoggingFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
MDC.put("username", session.getParameter("username")); // or where ever t is stored
chain.doFilter(request, response);
}
}
在您的log4j.xml中,此过滤器基于用户:
<appender name="UserDebug" class="org.apache.log4j.RollingFileAppender">
<param name="File" value="userdebug.log"/>
<param name="Append" value="true"/>
<param name="MaxFileSize" value="5000KB"/>
<param name="maxBackupIndex" value="5"/>
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%d{yyyy-MM-dd HH:mm:ss} [%t] user:%X{username} %-5p - %m%n" />
</layout>
<filter class="org.apache.log4j.varia.StringMatchFilter">
<param name="StringToMatch" value="user:fred" />
<param name="AcceptOnMatch" value="true" />
</filter>
<filter class="org.apache.log4j.varia.DenyAllFilter"/>
</appender>
%X{key} 输出 MDC 中的 MDC.get(key) 的值。如果需要更复杂的筛选器,可以自行扩展它,并自行查看 MDC 中的值。