在 Web 应用程序中记录用户活动

2023-12-19

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

典型的 Servlet 可能如下所示:

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

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


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

实施 MDC 过滤器

首先,实现一个 servlet 过滤器,将用户名添加到 MDC/NDC。 Logback提供了方便MDC插入Servlet过滤器 http://logback.qos.ch/apidocs/ch/qos/logback/classic/helpers/MDCInsertingServletFilter.html,Spring框架还添加了Log4jNestedDiagnosticContextFilter http://static.springsource.org/spring/docs/3.0.x/javadoc-api/org/springframework/web/filter/Log4jNestedDiagnosticContextFilter.html到商店。看看它们,但你需要一个像这样的定制的:

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在 Spring 安全过滤器之后。 MDC 功能非常灵活 - 如果需要,它会将 MDC 线程本地映射中保存的所有值添加到每个日志记录语句中。对于您的情况,只需添加以下内容:

%X{user}

到你的日志记录pattern http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/PatternLayout.html.

不显眼的记录方法参数/值

记录方法名称、参数和返回值由您决定(用户名将自动添加),但是有一些优雅的方法可以完全删除样板记录代码。尝试这个 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 http://forum.springsource.org/showthread.php?88890-MDC-Log4j-Filter-with-Spring-Security-3.0.2
  • 考虑使用Logback http://logback.qos.ch/作为日志库并坚持使用 SLF4J API。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Web 应用程序中记录用户活动 的相关文章

随机推荐

  • Square 随机数代表什么?

    我正在尝试向 Square 提交付款 但不确定该付款是什么card nonce代表 完整的 API 文档在这里 https docs connect squareup com api connect v2 endpoint createcu
  • 反转 DataFrame 列顺序

    我想简单地反转给定 DataFrame 的列顺序 我的数据框 data year 2010 2011 2012 2011 2012 2010 2011 2012 team Bears Bears Bears Packers Packers
  • 使用 spring-hateoas 反序列化包含(_links 和 _embedded)的 JSON

    我正在尝试调用非常简单的 json Web 服务 返回这种形式的数据 embedded users identifier 1 firstName John lastName Doe links self href http localhos
  • Mongodb类型参考节点

    我正在尝试引用节点模型中的另一个对象 User new Schema username type String index unique true Idea new Schema Creator type User 但我收到这个错误Unde
  • 无法从按钮 onclick 事件 ASP.NET 4 调用 Javascript 函数

    每当我调用 JavaScript 函数时asp button onclick事件我收到此错误消息 HTML
  • Android:如何将一个菜单 xml 包含在另一个菜单 xml 中?

    简单的问题 我有我的子项目菜单 menu menu
  • 权限问题:如何在 docker for windows 上设置权限以与 Wordpress 一起使用

    问题 I m trying to setup my developing environment using Docker for Windows for use with Wordpress I m using docker compos
  • 如何在所有测试文件之前运行 Jasmine

    我正在使用 Nodejs 为我们的 API 创建端到端测试套件 在每个测试运行之前 我需要插入该测试的数据库记录 许多有问题的表不使用本机自动增量类型字段作为其主键 我知道 数据库设计不好 但我无法控制 相反 他们使用 postgresql
  • 在二叉树中查找共同祖先

    在一次采访中有人问我这个问题 我有一个二叉树 我必须在给定该树的两个随机节点的情况下找到共同祖先 父级 我还得到了一个指向根节点的指针 我的回答是 分别遍历树的两个节点 直到到达预期的节点 并行遍历时将元素和下一个地址存储在链表中 那么我们
  • 删除字符串末尾的下划线和数字

    我正在使用一个包含带有一些下划线的列的数据集 有一个图案 但它们是不同的图案 如下所示 ID Col1 1029 ap analog 2334 critical 1 mm 1 2334 transpose 2 mm 2 9877 publi
  • php中逗号分隔的列表

    我正在尝试建立一个用逗号分隔的列表 应该如下所示 绿色 橙色 红色 i 0 taxonomy form state values taxonomy 5 foreach taxonomy as key gt value result db q
  • Java中如何打印Statement(CallableStatement)?

    如何打印此 OracleCallableStatement ocstmt OracleCallableStatement connection prepareCall call package method id gt name gt oc
  • 如何抑制CatBoost迭代结果?

    我正在尝试使用 CatBoost 来拟合二进制模型 当我使用下面的代码时 我想verbose False可以帮助抑制迭代日志 但事实并非如此 有没有办法避免打印迭代 model CatBoostClassifier iterations 3
  • 动态更改数据模板

    我有一个绑定到任务的项目控件 每个任务都有任务状态 我为每个任务状态定义了不同的数据模板 以及数据模板选择器 问题是我无法弄清楚当任务状态动态更改时如何触发数据模板选择器 我想知道如何将数据触发器与数据模板一起使用 如果这不起作用 我将探索
  • 我如何使用 javascript/jquery 知道给定字符串是 hex、rgb、rgba 或 hsl 颜色?

    我使用正则表达式来表示十六进制 a fA F0 9 6 a fA F0 9 3 但我不知道我应该做什么来找到 rgb rgba 和 hsl 我正在以字符串形式获取输入 例如 输入将包含 rgb 0 0 0 或 rgb 0 0 0 0 2 这
  • android 如何比较待处理的意图

    文档PendingIntent FLAG NO CREATE http developer android com reference android app PendingIntent html FLAG NO CREATE reads
  • Android 列表视图搜索过滤器

    我正在尝试为 Android 进行列表视图搜索 我发现很多教程都可以做到这一点 搜索栏位于顶部 如果您在框中键入内容 结果将被过滤 在我的应用程序中 我想在过滤完成后单击给定的项目 我已经实现了 setOnItemClickListener
  • 引导两个导航栏折叠

    在引导程序中 我想在彼此下方有两个导航栏 我的想法 Navbar 1有一个品牌 主菜单 Navbar 2 在navbar1下面 有一个品牌叫做 子菜单 当用户在手机上查看该网站时 他 她会看到两个可折叠的导航栏 用户现在可以选择要打开的导航
  • 您多久更新一次 SQL Server 2000 中的统计信息?

    我想知道更新统计数据之前是否对您有帮助 您是如何知道更新它们的 exec sp updatestats 是的 如果您发现查询的性能未达到应有的效果 更新统计信息会非常有帮助 这可以通过检查查询计划并注意何时执行表扫描或索引扫描而不是索引查找
  • 在 Web 应用程序中记录用户活动

    我希望能够在网络应用程序中记录用户活动 我目前正在使用 log4j 它可以很好地记录错误等 但我不确定记录用户 执行的 servlet 方法和方法参数的最佳方法是什么 我正在使用 spring security 进行身份验证 典型的 Ser