Java 在web应用程序中记录用户活动

Java 在web应用程序中记录用户活动,java,servlets,logging,spring-security,dwr,Java,Servlets,Logging,Spring Security,Dwr,我希望能够在web应用程序中记录用户活动。我目前正在使用log4j,它可以很好地记录错误等,但我不确定最好的方法是记录用户、执行的servlet方法和方法参数。我正在使用spring安全性进行身份验证 典型的servlet可能如下所示: public class BankAccountServlet { @RequestMapping("/deposit") public void deposit(double amount) { ... } @

我希望能够在web应用程序中记录用户活动。我目前正在使用log4j,它可以很好地记录错误等,但我不确定最好的方法是记录用户、执行的servlet方法和方法参数。我正在使用spring安全性进行身份验证

典型的servlet可能如下所示:

public class BankAccountServlet {
    @RequestMapping("/deposit")
    public void deposit(double amount) {
        ...
    }

    @RequestMapping("/checkBalance")
    public double checkBalance() {
        ...
    }
}
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
如果有两个用户,foo和bar,foo检查他的余额,bar存入两笔10.00和5.00的现金。我希望日志看起来像:

public class BankAccountServlet {
    @RequestMapping("/deposit")
    public void deposit(double amount) {
        ...
    }

    @RequestMapping("/checkBalance")
    public double checkBalance() {
        ...
    }
}
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

如果有人能提供一些建议,我将非常感谢他们的帮助。

我过去使用log4j记录的不仅仅是错误。我在代码中添加了信息标签,并更改了日志记录级别。这样,如果您决定不再需要记录这些活动,只需更改日志记录级别即可。我希望这会有所帮助。

使用内置于Log4J中的MDC/NDC功能实际上非常简单(SLF4J和Logback仅支持MDC)

实现MDC过滤器 首先,实现一个servlet过滤器,将用户名添加到MDC/NDC。Logback提供了方便,Spring框架也添加到了商店中。查看它们,但您需要这样一个自定义的:

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值 确保在Spring安全筛选器之后的
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>


  • 考虑将其用作日志库,并坚持使用SLF4J API

  • 如果您想登录服务器日志,请使用ServletContext.log()方法,该方法使用容器日志机制并登录到容器日志中。

    这可能与上下文无关,但如果这是一个真正的银行应用程序,我不会记录此类数据,没有为日志提供足够的保护。对于Log4J2有类似的例子吗?