2

客户希望我们“记录”用户在我们系统上执行的“操作”:主要是创建、删除和更新。我已经有一个记录跟踪的方面,但是它在记录每个方法调用的非常低的级别上工作。因此,如果用户单击“打开医疗文件”按钮,日志将显示:

  1. closePreviousFiles("零号病人")
  2. createMedicalFile("零号病人") --> file #001
  3. changeStatus("#001") --> 打开

而期望的结果是:

  1. 为零号病人打开医疗文件#001

我正在考虑使用日志语句来检测 Struts2 操作,但我想知道......是否有另一种方法可以做到这一点?我可能会再次使用 AspectJ(或过滤器)并将逻辑保留在一个地方,以便我可以轻松配置日志,但我担心一切都会变得更难理解(即“此操作的日志是错误的......我到底应该去哪里找麻烦?”)。

4

4 回答 4

3

听起来您的客户想要对系统中用户的操作进行审计跟踪。

考虑在每个操作的入口点(来自 Web 请求)以在操作上使用枚举/常量启动审计条目。如果可能,用用户提供的信息填充它。

在退出/最后,在审核中指明是成功还是失败。伪代码示例:

enum Actions {
  OPEN_MEDICAL_FILE
  ...
}

void handleRequest(...) {
  String patient = ...;
  Audit audit = new Audit(OPEN_MEDICAL_FILE);
  audit.addParameter("patient", patient);
  try {
     ... more things ..
     audit.addParameter("file", "#001");
     ... more things ...
     audit.setSuccess();
  } finally {
    audit.save();
  }
}

这里重要的是保存所有用户操作,无论成功或失败。此外,客户确实需要了解所有相关信息以及操作。

由于我们正在记录操作常量和数据,因此可以单独编码向客户端显示审计。您也获得了灵活性,因为演示字符串的更改(例如,“为患者 0 打开的医疗文件 #001”到“打开的患者 0 #001 的医疗文件)不是在操作时确定的,而是在以后确定的。你不'不必重新整理审计数据。

于 2008-12-24T15:28:21.117 回答
1

我最近对日志进行了后处理以生成摘要。您可能需要考虑这种方法,特别是如果上述日志中的 #2 和 #3 是在不同的位置生成的,并且所需的结果需要将状态从一个地方带到另一个地方。

于 2008-12-24T11:26:38.170 回答
1

如果您正在处理医疗数据,您可能需要同时考虑日志记录和版本控制。我什至会考虑用数据库触发器来做这件事。我不会做很多 Java 编程,但我已经与我们的学生信息系统团队讨论过这个问题。他们在后端使用 Oracle 并在他们的连接中注册一个会话变量。他们的触发器使用这个会话变量来创建关键表的日志条目和版本历史(更新/删除)。这为他们提供了审计和回滚功能。我认为这两种方法都对医疗记录应用程序有用。

他们还使用 log4j 进行应用程序级别的日志记录,但数据记录发生在数据库中。

于 2008-12-24T13:30:37.250 回答
1

我在 Struts2 动作中做过类似的事情,我使用了“log4j”。根据您的应用服务器,它可能有一个集成的日志系统,允许使用消息目录(例如:Weblogic)。

于 2009-01-13T18:00:47.813 回答