代码之家  ›  专栏  ›  技术社区  ›  Manrico Corazzi

记录用户操作

  •  2
  • Manrico Corazzi  · 技术社区  · 16 年前

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

    1. ClosePreviousFiles(“患者零”)。
    2. 创建医疗文件(“患者零”)—>文件001
    3. ChangeStatus(“001”)—>打开

    而期望的结果是:

    1. 已打开0号患者的医疗文件001

    我正在考虑用日志语句检测struts2操作,但我想知道…还有别的办法吗?我可能会再次使用AspectJ(或过滤器),并将逻辑保持在一个地方,这样我可以轻松地配置日志,但我担心所有事情都将变得难以理解(即,“此操作的日志是错误的…”我到底该在哪里找麻烦呢?”.

    4 回复  |  直到 16 年前
        1
  •  3
  •   Kent Lai    16 年前

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

    考虑在每个操作的入口点(来自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();
      }
    }
    

    这里重要的是,无论成功与否,都会保存所有用户操作。此外,客户真的需要知道所有相关的信息和行动。

    由于我们正在记录操作常量和数据,因此可以单独对向客户机显示的审计进行编码。您也获得了灵活性,因为在操作时不确定演示字符串(例如“opened medical file 001 for patient zero”到“patient zero 001 medical file opened”)的更改,而是在以后更改。您不必重新检查审计数据。

        2
  •  1
  •   Miserable Variable    16 年前

    我最近发布处理过的日志来生成摘要。您可能需要考虑这种方法,特别是如果上述日志中的2和3在不同的位置生成,并且所需的结果需要将状态从一个位置转移到另一个位置。

        3
  •  1
  •   tvanfosson    16 年前

    如果您使用的是医疗数据,那么您可能需要同时考虑日志记录和版本控制。我甚至会考虑用数据库触发器来实现这一点。我不做很多Java编程,但是我已经和我们的学生信息系统小组讨论了这个问题。他们在后端使用Oracle,并用连接注册会话变量。它们的触发器使用此会话变量创建关键表的日志条目和版本历史记录(更新/删除时)。这为他们提供了审计和回滚功能。我认为这两种方法对申请病历都是有用的。

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

        4
  •  1
  •   xgMz    16 年前

    我在struts2操作中做过类似的工作,我使用了“log4j”。根据应用服务器的不同,它可能有一个集成的日志记录系统,允许使用消息目录(例如:WebLogic)。