Rejestrowanie aktywności użytkowników w aplikacji internetowej
Chciałbym mieć możliwość rejestrowania aktywności użytkowników w aplikacji internetowej. Obecnie używam log4j, który działa dobrze do rejestrowania błędów itp, ale nie jestem pewien, jakie jest najlepsze podejście do logowania użytkownika, wykonanej metody servlet i metody params. Używam spring security do uwierzytelniania.
Typowy servlet może wyglądać tak:
public class BankAccountServlet {
@RequestMapping("/deposit")
public void deposit(double amount) {
...
}
@RequestMapping("/checkBalance")
public double checkBalance() {
...
}
}
Jeśli jest dwóch użytkowników, foo i bar, gdzie foo sprawdza swoje saldo i bar wpłaca dwie sumy gotówki 10.00 i 5.00. Chciałbym, aby dzienniki wyglądały like:
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
Gdyby ktoś mógł coś doradzić, byłbym wdzięczny za pomoc. 3 answers
W rzeczywistości jest to dość proste do osiągnięcia przy użyciu funkcji MDC / NDC wbudowanych w Log4J (SLF4J i Logback obsługują tylko MDC).
Implementacja filtra MDC
Najpierw zaimplementuj filtr serwletów, który doda nazwę Użytkownika do MDC / NDC. Logback dostarcza wygodny MDCInsertingServletFilter, Spring Framework dodaje również Log4jNestedDiagnosticContextFilter do sklepu. Spójrz na nie, ale będziesz potrzebował takiego niestandardowego:
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");
}
}
//...
}
Dodawanie wartości MDC do twojego logging pattern
Upewnij się, że filtr jest zastosowany w web.xml
po filtrze zabezpieczającym sprężynę. Funkcja MDC jest naprawdę sprytna-na żądanie doda wszystkie wartości zapisane w MDC thread-local map do każdej instrukcji logowania. W Twoim przypadku po prostu dodaj to:
%X{user}
Do logowania wzór .
Dyskretne parametry/wartości metody logowania
Logowanie nazwy metody, parametrów i wartości zwrotnych zależy od ciebie (nazwa użytkownika zostanie dodana automatycznie) , ale tam to kilka eleganckich sposobów na całkowite usunięcie kodu logowania boilerplate. Spróbuj tej wiosny wbudowany aspekt:
<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>
Myśli końcowe
- spójrz na ten wątek: http://forum.springsource.org/showthread.php?88890-MDC-Log4j-Filter-with-Spring-Security-3.0.2
- rozważ użycie Logback jako biblioteki logowania i trzymaj się API SLF4J.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-09-04 09:02:45
Używałem log4j w przeszłości, aby rejestrować więcej niż tylko błędy. Dodałem znaczniki informacji w całym kodzie i zmieniłem poziom logowania. W ten sposób, jeśli zdecydujesz, że nie musisz już logować tych działań, możesz po prostu zmienić poziom logowania i gotowe. Mam nadzieję, że to pomoże.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-05-24 20:03:07
Jeśli chcesz się zalogować, użyj ServletContext.metoda log (), która wykorzystuje mechanizm logowania kontenerów i loguje do dzienników kontenerów..
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-05-25 06:19:49