记录日志大全

记录日志大全

第15章 记录日志
记录日志的目的是为了跟踪流程执行的历史,当流程执行的运行时数据变化时,所有增量都被保存到日志。
不要把本章所述的流程日志与软件日志相混淆,软件日志跟踪软件程序的执行(通常为了调试),而流程日志跟踪流程实例的执行。
对于流程日志信息有很多用途,非常明显的用途就是根据一个流程执行的参与者查阅流程历史。
另外一个用途就是业务活动监控(Business Activity Monitoring 简写BAM)。BAM将查询或分析流程执行日志,用来找出有关业务流程的有用的统计信息,例如:流程的每个步骤平均花费了多长时间?哪里是流程瓶颈?…在一个组织里,这些信息对于实现真正的业务流程管理是很关键的,真正的业务流程管理就是一个组织怎样管理它们的流程,怎样通过信息技术来支持流程,以及怎样在一个迭代过程中改善流程。
还有一个用途就是撤消功能,流程日志可被用于实现撤消。由于日志包含了运行时信息的增量数据,因此日志可以倒序播放,以把流程带回以前的状态。
15.1 创建日志
日志在运行流程执行时由jBPM模块产生,另外用户也可用插入流程日志。日志实体是一个继承自org.jbpm.logging.log.ProcessLog的java对象,流程日志实体被添加到LoggingInstance,LoggingInstance是ProcessInstance的一个可选的扩展。
jBPM生成多种日志:图执行日志,上下文日志和任务管理日志。有关这些日志包含的数据的更多信息,请查询javadocs,最好从org.jbpm.loggin.log.ProcessLog类开始,因为从这个类可导航到继承树。
LoggingInstance会聚集所有日志实体,当ProcessInstance被保存时,LoggingInstance中的所有日志将被清洗刷新(flush)到数据库,ProcessInstance的logs数据成员(译者注:logs应该是LoggingInstance的数据成员)并没有用hibernate映射,用来避免在每个事务中都从数据库中检索日志。每个ProcessLog在执行路径(Token)的上下文中被制造,因此ProcessLog引用令牌,而令牌也作为一个索引序号生成器为令牌里的ProcessLog索引提供服务,这对于日志检索是很重要的,这种方式下,在后续事务中产生的日志将有一个连续的序号(哇,这里会有许多序号:)。
对于发布来说日志是不重要的,在ProcessDefinition中去掉可选的LoggingDefinition就可以了,这将阻止LoggingInstance被捕获,从而也就没有日志将被维护。今后我们将在日志之上增加更加细粒度的配置控制,请参看jira“日志级别配置”。
下面是添加流程日志的API方法。
public class LoggingInstance extends ModuleInstance {
...
public void addLog(ProcessLog processLog) {...}
...
}
日志信息的UML图如下:
记录日志大全
15.1 日志信息类图
CompositeLog是一类特别的日志实体,它作为许多子日志的父日志,因此可以在日志中创建一个层次结构,插入日志的API如下:
public class LoggingInstance extends ModuleInstance {
...
public void startCompositeLog(CompositeLog compositeLog) {...}
public void endCompositeLog() {...}
...
}
CompositeLog应该总是在一个try-finally块中被调用,以确保日志的层次结构是一致的。例如:
startCompositeLog(new MyCompositeLog());
try {
...
} finally {
endCompositeLog();
}
15.2 日志检索
如前面所说,日志不能通过导航LoggingInstance到它的日志从数据库中检索,作为替代,流程实例的日志总是可以从数据库中查询,LoggingSession有两个方法用作这个目的。
第一个方法检索一个流程实例的所有日志,这些日志在Map中根据令牌进行分组,map将为流程实例中的每个令牌关联一个ProcessLog列表,这个列表以与日志创建时的相同的顺序包含ProcessLog。
public class LoggingSession {
...
public Map findLogsByProcessInstance(long processInstanceId) {...}
...
}
第二个方法为指定的令牌检索日志,返回的列表以与日志创建时的相同的顺序包含ProcessLog。
public class LoggingSession {
public List findLogsByToken(long tokenId) {...}
...
}
15.3 数据仓库
有时你可能想要为jbpm流程日志使用数据仓库,数据仓库意味着你创建一个单独的包含流程日志的数据库,以用于不同的用途。
可能有很多理由使你为流程日志信息创建一个数据仓库,有时可能是为了从所使用的数据库中卸下繁重的查询,另外一种情况可能是为了做某些扩展的分析。可以对一个数据库模式(schema)进行改进优化以适应其目的来实现数据仓库。
在本章我们只是在jBPM中推荐了数据仓库技术,用途是多变的,防止在jBPM中包含一个通用的解决方案来覆盖所有的需求。