背景
有问题的应用程序是部署在 Tomcat 中的 Java Web 应用程序,并使用 Apache CXF 公开 REST 服务。我找到了 Spring 配置,但不确定它与 CXF 基础设施的连接情况。
每次发生重要事件时,例如更新或删除实体,我想记录信息,包括(但不限于):
- 发生了什么
- 谁提出了请求
- 改变了什么实体
- 实体的新状态(如果适用)
- 有关发送的任何通知电子邮件的信息
- ETC...
当前设置和挑战
我们有几个层,调用看起来像这样:控制器 > 服务 > 数据层 > 实用程序(电子邮件、SMS 发送等......)。
问题是,我想要收集和记录的数据开始可用并且仅在单独的层中可用。有时数据通过参数传递到下一层,但有时它们没有传递,因为其他层不需要数据。这里有些例子:
- 一些 HTTP 请求相关数据仅用于一些验证,并不会发送到服务层。
- 有时,核心实体数据仅在服务层和数据层可用,而对控制器不可用。
- Utils 的各个层会生成一些其他层不知道的最终数据片段(如链接、代码、最终电子邮件内容)。
但我需要从所有层收集此类信息并将它们记录为审计目的,作为单个日志行。
约束
- 代码在尊重层边界方面设计得不好。所以,有时事情会在不应该的地方传递。但我不能继续这样做。
- 我无法将所有需要的数据返回到控制器并最终将它们记录在那里,因为中间层的方法在很多地方都被调用,并且全部重构它们是不切实际的。
- 我不能将它们分别记录在不同的地方,因为要求不允许这样做。如果没有其他方法,我可以推送这个策略,并有一个共同的请求 ID 或其他东西和多个日志行,以将它们关联起来。
我的问题是,我应该如何以及在哪里收集所有这些数据并将它们写入审计日志?在 Java Web 应用程序中执行上述操作的最佳实践是什么?