第 13 章 日志记录
请阅读本章,了解业务流程管理器中存在的日志记录功能及其可以使用的各种方法。
日志记录的目的是记录进程执行的历史记录。随着每个进程执行更改的运行时数据,更改存储在日志中。
注意
在本章中介绍的 进程日志记录 与软件日志记录 不混淆。软件日志记录跟踪软件程序的执行(通常用于调试它)。按 contast 跟踪进程实例的执行过程日志。
进程日志信息可能很有用的方式。其中的最明显是流程执行专家对流程历史记录的咨询。
另一个用例是 业务活动监控 (BAM)。这可用于查询或分析进程执行的日志,以查找有关流程的有用统计信息。这些信息是在机构中实施"实时"的进程管理的关键。(需要管理流程是组织如何管理其流程、信息技术如何支持这些流程以及如何在迭代过程中相互使用两者。)
进程日志也可用于实施"undos"。由于日志包含所有运行时信息更改的记录,因此可以按照相反的顺序"played"来使进程回到以前的状态。
13.1. 日志创建 复制链接链接已复制到粘贴板!
复制链接链接已复制到粘贴板!
Business Process Manager 模块在运行进程执行时生成日志。但是用户也可以插入进程日志。(日志条目是一个 Java 对象,从
org.jbpm.logging.log.ProcessLog
.)继承。) 进程日志条目添加到 LoggingInstance
中,这是 ProcessInstance
的可选扩展。
商业流程管理器生成许多不同类型的日志,它们是图形执行日志、上下文日志和任务管理日志。好的起点是
org.jbpm.logging.log.ProcessLog
,因此可以使用它浏览继承的 树
。
LoggingInstance
收集所有日志条目。保存 ProcessInstance
时,它们会从此处刷新到数据库。( ProcessInstance
的logs 字段没有映射到 Hibernate。这样,为了避免这些日志从每个事务中的数据库检索。
每个
ProcessInstance
在执行路径的上下文中进行,因此 ProcessLog
代表该令牌,它也充当 索引序列生成器。(这对于日志检索很重要,因为这意味着后续事务生成的日志应具有顺序序列号。)
使用此 API 方法添加进程日志:
public class LoggingInstance extends ModuleInstance { ... public void addLog(ProcessLog processLog) {...} ... }
public class LoggingInstance extends ModuleInstance {
...
public void addLog(ProcessLog processLog) {...}
...
}
这是用于信息日志的 UML 图:
图 13.1. 192.168.1.0/24 日志记录信息类图
CompositeLog 是一个特殊情况。它充当多个子项的父日志,从而创建要应用的层次结构的方法。以下应用程序编程接口用于插入日志:
CompositeLog
s 应该总是在 try-finally-block
中调用,以确保分级结构一致。例如:
13.2. 日志配置 复制链接链接已复制到粘贴板!
复制链接链接已复制到粘贴板!
如果日志不适用于特定部署,只需从
jbpm.cfg.xml
配置文件的 jbpm-context 部分删除日志记录行:
<service name='logging' factory='org.jbpm.logging.db.DbLoggingServiceFactory' />
<service name='logging'
factory='org.jbpm.logging.db.DbLoggingServiceFactory' />
要过滤日志,请编写
LoggingService
的自定义实现(这是 DbLoggingService
的子类)。完成后,为日志记录创建一个自定义 ServiceFactory
,并在 factory
属性中指定它。
13.3. logtrieval 复制链接链接已复制到粘贴板!
复制链接链接已复制到粘贴板!
进程实例日志必须始终通过数据库查询检索。可以通过日志记录会话实现这一目标
有两种方法
。
第一种方法检索进程实例的所有日志。这些日志将按映射中的令牌分组。此映射会将
ProcessLogs
列表与进程实例中的每个令牌相关联。该列表将包含 ProcessLogs
,其顺序与创建它们的顺序相同。
public class LoggingSession { ... public Map findLogsByProcessInstance(long processInstanceId) {...} ... }
public class LoggingSession {
...
public Map findLogsByProcessInstance(long processInstanceId) {...}
...
}
第二种方法检索特定令牌的日志。该列表将包含
ProcessLogs
,其顺序与创建它们的顺序相同。
public class LoggingSession { public List findLogsByToken(long tokenId) {...} ... }
public class LoggingSession {
public List findLogsByToken(long tokenId) {...}
...
}
请阅读本章后,您现在了解日志记录的工作原理,并了解其可以放入的不同用途。