На самом деле довольно просто добиться этого, используя функциональность 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}
к вашему журналу шаблон .
Ненавязчивые параметры / значения метода ведения журнала
Имя метода ведения журнала,Параметры и возвращаемые значения зависят от вас (имя пользователя будет добавлено автоматически), но есть несколько элегантных способов полностью удалить шаблонный регистрационный код.Попробуйте встроенный аспект 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>
Заключительные мысли