Регистрация активности пользователя в веб-приложении
Я хотел бы иметь возможность регистрировать действия пользователей в веб-приложении. В настоящее время я использую log4j, который хорошо работает для регистрации ошибок и т. Д., Но я не уверен, что лучший подход - это регистрировать пользователя, выполняемый метод сервлета и параметры метода. Я использую Spring Security для аутентификации.
Типичный сервлет может выглядеть так:
public class BankAccountServlet {
@RequestMapping("/deposit")
public void deposit(double amount) {
...
}
@RequestMapping("/checkBalance")
public double checkBalance() {
...
}
}
Если есть два пользователя, foo и bar, где foo проверяет свой баланс и bar вносит две суммы наличных 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}
на ваш шаблон регистрации.
Ненавязчивые параметры / значения метода регистрации
Имя метода ведения журнала, параметры и возвращаемые значения зависят от вас (имя пользователя будет добавлено автоматически), но есть несколько элегантных способов полного удаления стандартного кода регистрации. Попробуйте этот встроенный аспект 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 в качестве библиотеки журналов и придерживайтесь SLF4J API.
Я использовал log4j в прошлом, чтобы регистрировать больше, чем просто ошибки. Я добавил теги INFO в свой код и изменил уровень ведения журнала. Таким образом, если вы решили, что вам больше не нужно регистрировать эти действия, вы можете просто изменить уровень регистрации, и все готово. Надеюсь, это поможет.
Если вы хотите войти в систему нескольких журналов, используйте метод ServletContext.log(), который использует механизм регистрации контейнеров и регистрируется в журналах контейнеров.