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.
Author: James, 2011-05-24

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

 32
Author: Tomasz Nurkiewicz,
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.

 0
Author: DouglasHeitner,
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..

 0
Author: Ramesh PVK,
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