gpt4 book ai didi

java - 跨层收集数据以编写审计日志

转载 作者:行者123 更新时间:2023-11-28 23:22:03 24 4
gpt4 key购买 nike

背景

有问题的应用程序是部署在 Tomcat 中的 Java 网络应用程序,并使用 Apache CXF 公开 REST 服务。我找到了 Spring 配置,但不确定它与 CXF 基础设施的连接情况如何。

每当发生重要事情时,例如更新或删除实体,我想记录的信息包括(但不限于):

  1. 发生了什么
  2. 谁提出了请求
  3. 更改了什么实体
  4. 实体的新状态(如果适用)
  5. 有关发送的任何通知电子邮件的信息
  6. 等...

当前设置和挑战

我们有多个层,调用如下所示:Controller > Service > Data Layer > Utils(电子邮件、SMS 发送等...)。

问题是,我想要收集和记录的数据开始可用,并且仅在单独的层中可用。有时数据通过参数传递到下一层,但有时它们不会传递,因为其他层不需要数据。以下是一些示例:

  • 一些与HTTP请求相关的数据仅用于一些验证,不会发送到服务层。
  • 有时,核心实体数据仅在服务层和数据层可用, Controller 不可用。
  • Utils 的各个层生成一些其他层不知道的最终数据(例如链接、代码、最终电子邮件内容)。

但我需要从所有层收集此类信息,并将它们作为单个日志行记录下来以供审计。

约束

  • 代码在尊重层边界方面设计得不好。所以,有时事情会在不应该的地方传递。但我不能继续这样做了。
  • 我无法将所有需要的数据返回到 Controller 并最终将它们记录在那里,因为在很多地方调用了中间层的方法,并且重构它们是不切实际的。
  • 我不能将它们分别记录在不同的地方,因为要求不允许这样做。如果没有任何其他方式,我可以插入这个策略并有一个共同的请求 ID 或其他东西和多个日志行,以将它们关联起来。

我的问题是,我应该如何以及在何处收集所有这些数据并将它们写入审计日志?在 Java Web 应用程序中执行上述操作的最佳做​​法是什么?

最佳答案

听起来您的应用程序一团糟。

但是,只要一切都是基于请求触发的,就应该仍然可以执行此操作。

这里有两种方法:

1) 使用 Logback 等日志记录框架中的 MDC 对象。这个对象可以在请求的基础上用键填充,你可以在其中附加任意信息,这些信息可以在以后提取用于日志记录(或者它可以作为附加字段自动附加到你的日志消息中)。在这里阅读:https://logback.qos.ch/manual/mdc.html

这将是我推荐的解决方案,因为它非常符合您要实现的目标。如果那不可能,那么:

2) 创建一个可以静态访问 ThreadLocal 的对象,您可以使用该对象跟踪各个层的信息。请求完成时将其记录在 HTTP 过滤器中。并确保再次清除信息,以免与使用同一线程的下一个请求混淆。

如果您不想用审计日志记录污染您的代码,您可以考虑使用方面(面向方面​​的编程)将此功能添加到您的类中。

关于java - 跨层收集数据以编写审计日志,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42370313/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com