我希望能够在Web应用中记录用户活动。我目前正在使用log4j,它适用于日志记录错误等,但我不确定最好的方法是记录用户,执行的servlet方法和方法参数。我正在使用spring security进行身份验证。
典型的servlet可能如下所示:
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
如果有人可以提供一些建议,我真的很感激他们的帮助。
答案 0 :(得分:32)
使用内置于Log4J中的MDC / NDC功能实现非常简单(SLF4J和Logback仅支持MDC)。
首先,实现一个将用户名添加到MDC / NDC的servlet过滤器。 Logback提供了方便的MDCInsertingServletFilter,Spring框架还向商店添加了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");
}
}
//...
}
确保在Spring安全过滤器之后在web.xml
中应用此过滤器。 MDC功能非常灵活 - 如果需要,它会将MDC线程局部映射中保存的所有值添加到每个日志记录语句中。在您的情况下,只需添加:
%X{user}
登录pattern。
记录方法名称,参数和返回值取决于您(用户名将自动添加),但有一些优雅的方法可以完全删除样板记录代码。试试这个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>
答案 1 :(得分:0)
我过去使用过log4j来记录错误而不仅仅是错误。我在整个代码中添加了INFO标记并更改了日志记录级别。这样,如果您决定不再需要记录这些活动,则只需更改日志记录级别即可完成。我希望有所帮助。
答案 2 :(得分:0)
如果要登录服务器日志,请使用ServletContext.log()方法,该方法使用容器日志记录机制并登录容器日志。