Ведение журнала действий пользователя в веб-приложении
Я хотел бы иметь возможность регистрировать действия пользователей в веб-приложении. В настоящее время я использую log4j, который хорошо работает для регистрации ошибок и т. д., Но я не уверен, что лучший подход заключается в регистрации пользователя, выполненного метода сервлета и параметров метода. Я использую spring security для аутентификации.
обычный сервлет может выглядеть так:
public class BankAccountServlet {
@RequestMapping("/deposit")
public void deposit(double amount) {
...
}
@RequestMapping("/checkBalance")
public double checkBalance() {
...
}
}
Если есть два пользователя, foo и bar, где foo проверяет свой баланс и бар депозиты две суммы наличными 10.00 и 5.00. Я хотел бы журналы выглядят так:
01/01/1970 23:59:59 - foo - checkBalance
02/01/1970 23:59:59 - bar - deposit - 10.00
02/01/1970 23:59:59 - bar - deposit - 5.00
Если кто-нибудь может предложить некоторые советы, я был бы очень признателен за их помощь.
3 ответов
это на самом деле довольно просто достичь, используя функциональность 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
после фильтра безопасностью весны. Функция MDC действительно скользкая - она добавит все значения, сохраненные в локальной карте потока MDC, к каждому оператору ведения журнала, если потребуется. В вашем случае просто добавьте это:
%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>
заключение
- посмотрите на эту тему: http://forum.springsource.org/showthread.php?88890-MDC-Log4j-Filter-with-Spring-Security-3.0.2
- рассмотрите возможность использования Logback так в качестве библиотеки журналов и палки с API SLF4J.
Я использовал log4j в прошлом, чтобы регистрировать больше, чем просто ошибки. Я добавил информационные теги по всему коду и изменил уровень ведения журнала. Таким образом, если вы решите, что вам больше не нужно регистрировать эти действия, вы можете просто изменить уровень ведения журнала, и все готово. Надеюсь, это поможет.
Если вы хотите войти в журналы sever, используйте ServletContext.метод log (), который использует механизм ведения журнала контейнера и входит в журналы контейнера..