实际上,使用 Log4J 中内置的 MDC/NDC 功能实现非常简单(SLF4J 和 Logback 仅支持 MDC)。
实现 MDC 筛选器
首先,实现一个 servlet 筛选器,它将用户名添加到 MDC/NDC。Logback提供了方便的MDCInsertingServletFilter,Spring框架还将Log4jNestedDiagnosticContextFilter添加到商店中。看看它们,但你需要一个像这样的自定义:
public class UserToMdcFilter implements javax.servlet.Filter
{
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
MDC.put("user", SecurityContextHolder.getContext().getAuthentication().getPrincipal());
try {
chain.doFilter(request, response);
} finally {
MDC.remove("user");
}
}
//...
}
将 MDC 值添加到日志记录模式
确保在 Spring 安全筛选器之后应用此筛选器。MDC 功能非常流畅 - 如果需要,它会将保存在 MDC 线程本地映射中的所有值添加到每个日志记录语句中。在您的情况下,只需添加以下内容:web.xml
%X{user}
到日志记录模式。
不显眼的日志记录方法参数/值
日志记录方法名称,参数和返回值由您决定(用户名将自动添加),但是有一些优雅的方法可以完全删除样板日志记录代码。试试这个春天内置的方面:
<bean id="customizableTraceInterceptor" class="org.springframework.aop.interceptor.CustomizableTraceInterceptor">
<property name="enterMessage" value="Entering $[methodName]($[arguments])"/>
<property name="exitMessage" value="Leaving $[methodName](): $[returnValue]"/>
</bean>
<aop:config>
<aop:advisor advice-ref="customizableTraceInterceptor" pointcut="execution(public * BankAccountServlet.*(..))"/>
</aop:config>
最后的思考