使用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值添加到您的日志记录模式
确保
web.xml在Spring安全过滤器之后应用此过滤器。MDC功能非常出色-
如果需要,它将把保存在MDC线程本地映射中的所有值添加到每个日志记录语句中。就您而言,只需添加以下内容:
%X{user}到您的日志记录模式。
不干扰日志记录方法的参数/值
记录方法的名称,参数和返回值由您决定(用户名将自动添加),但是有一些优雅的方法可以完全删除样板记录代码。试试这个Spring内置方面:
<bean id="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>
最后的想法
- 查看此线程:http : //forum.springsource.org/showthread.php?88890-MDC-Log4j-Filter-with-Spring-Security-3.0.2
- 考虑将Logback用作日志记录库,并坚持使用SLF4J API。



