Ответ 1
На самом деле довольно просто добиться использования функций MDC/NDC, встроенных в Log4J (SLF4J и Logback поддерживают только MDC).
Реализация фильтра MDC
Сначала создайте фильтр сервлета, который добавит имя пользователя в MDC/NDC. Logback обеспечивает удобный MDCInsertingServletFilter, Spring framework также добавляет 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}
к вашему протоколированию pattern.
Параметры/значения метода ненавязчивого ведения журнала
Имя метода регистрации, параметры и возвращаемые значения зависит от вас (имя пользователя будет добавляться автоматически), но есть некоторые изящные способы полностью удалить код регистрации шаблонов. Попробуйте этот Spring встроенный аспект:
<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>
Заключительные мысли
- Посмотрите эту тему: http://forum.springsource.org/showthread.php?88890-MDC-Log4j-Filter-with-Spring-Security-3.0.2
- Рассмотрите возможность использования Logback в качестве библиотеки протоколирования и использования API SLF4J.