jBPM和日志记录

时间:2016-01-28 07:50:07

标签: logging log4j slf4j jbpm

我将jBPM集成为我的应用程序中的内部工作流执行引擎。我想用两种方式在jBPM中使用slf4j(在引擎盖下运行log4j2)记录器。

  1. 我想将它用作审核日志。我知道jBPM可以提供audit logging through a specific JPA configuration,但是在我的情况下这不方便,我想使用特定的slf4j配置。
  2. 我想在jBPM工作流程的入门脚本等中使用它,例如编写logger.trace("Variable a value:"+a.getValue());
  3. jBPM中是否存在这样的日志记录集成机制?

2 个答案:

答案 0 :(得分:0)

我解决了我的问题,因此在这里提供答案,以便它也可以对其他人有用......

  1. 我自己使用events mechanism provided by the jBPM实现了自定义审核日志机制。更具体地说,在我处理工作流开始的类中,我添加了一个事件监听器,它会收到每个工作流操作的通知,并将其记录到我的自定义slf4j记录器中(参见下一个代码片段):

    ksession.addEventListener(new DefaultProcessEventListener() {
        public void beforeProcessStarted(ProcessStartedEvent event) {
            WorkflowProcessInstance process = (WorkflowProcessInstance) event.getProcessInstance();
            logger.trace("jBPM event 'beforeProcessStarted'. Process ID: " + process.getId()
                    + ", Process definition ID: " + process.getProcessId() + ", Process name: "
                    + process.getProcessName() + ", Process state: " + process.getState() + ", Parent process ID: "
                    + process.getParentProcessInstanceId());
        }
    
        public void afterProcessStarted(ProcessStartedEvent event) {
            WorkflowProcessInstance process = (WorkflowProcessInstance) event.getProcessInstance();
            logger.trace("jBPM event 'afterProcessStarted'. Process ID: " + process.getId()
                    + ", Process definition ID: " + process.getProcessId() + ", Process name: "
                    + process.getProcessName() + ", Process state: " + process.getState() + ", Parent process ID: "
                    + process.getParentProcessInstanceId());
        }
    
        public void beforeProcessCompleted(ProcessCompletedEvent event) {
            WorkflowProcessInstance process = (WorkflowProcessInstance) event.getProcessInstance();
            logger.trace("jBPM event 'beforeProcessCompleted'. Process ID: " + process.getId()
                    + ", Process definition ID: " + process.getProcessId() + ", Process name: "
                    + process.getProcessName() + ", Process state: " + process.getState() + ", Parent process ID: "
                    + process.getParentProcessInstanceId());
        }
    
        public void afterProcessCompleted(ProcessCompletedEvent event) {
            WorkflowProcessInstance process = (WorkflowProcessInstance) event.getProcessInstance();
            logger.trace("jBPM event 'afterProcessCompleted'. Process ID: " + process.getId()
                    + ", Process definition ID: " + process.getProcessId() + ", Process name: "
                    + process.getProcessName() + ", Process state: " + process.getState() + ", Parent process ID: "
                    + process.getParentProcessInstanceId());
        }
    
        public void beforeNodeTriggered(ProcessNodeTriggeredEvent event) {
            WorkflowProcessInstance process = (WorkflowProcessInstance) event.getProcessInstance();
            NodeInstance node = event.getNodeInstance();
            logger.trace("jBPM event 'beforeNodeTriggered'. Process ID: " + process.getId()
                    + ", Process definition ID: " + process.getProcessId() + ", Process name: "
                    + process.getProcessName() + ", Process state: " + process.getState() + ", Parent process ID: "
                    + process.getParentProcessInstanceId() + ", Node instance ID: " + node.getId() + ", Node ID: "
                    + node.getNodeId() + ", Node name: " + node.getNodeName());
    
        }
    
        public void afterNodeTriggered(ProcessNodeTriggeredEvent event) {
            WorkflowProcessInstance process = (WorkflowProcessInstance) event.getProcessInstance();
            NodeInstance node = event.getNodeInstance();
            logger.trace("jBPM event 'afterNodeTriggered'. Process ID: " + process.getId()
                    + ", Process definition ID: " + process.getProcessId() + ", Process name: "
                    + process.getProcessName() + ", Process state: " + process.getState() + ", Parent process ID: "
                    + process.getParentProcessInstanceId() + ", Node instance ID: " + node.getId() + ", Node ID: "
                    + node.getNodeId() + ", Node name: " + node.getNodeName());
    
        }
    
        public void beforeNodeLeft(ProcessNodeLeftEvent event) {
            WorkflowProcessInstance process = (WorkflowProcessInstance) event.getProcessInstance();
            NodeInstance node = event.getNodeInstance();
            logger.trace("jBPM event 'beforeNodeLeft'. Process ID: " + process.getId() + ", Process definition ID: "
                    + process.getProcessId() + ", Process name: " + process.getProcessName() + ", Process state: "
                    + process.getState() + ", Parent process ID: " + process.getParentProcessInstanceId()
                    + ", Node instance ID: " + node.getId() + ", Node ID: " + node.getNodeId() + ", Node name: "
                    + node.getNodeName());
    
        }
    
        public void afterNodeLeft(ProcessNodeLeftEvent event) {
            WorkflowProcessInstance process = (WorkflowProcessInstance) event.getProcessInstance();
            NodeInstance node = event.getNodeInstance();
            logger.trace("jBPM event 'afterNodeLeft'. Process ID: " + process.getId() + ", Process definition ID: "
                    + process.getProcessId() + ", Process name: " + process.getProcessName() + ", Process state: "
                    + process.getState() + ", Parent process ID: " + process.getParentProcessInstanceId()
                    + ", Node instance ID: " + node.getId() + ", Node ID: " + node.getNodeId() + ", Node name: "
                    + node.getNodeName());
    
        }
    
        public void beforeVariableChanged(ProcessVariableChangedEvent event){
            WorkflowProcessInstance process = (WorkflowProcessInstance) event.getProcessInstance();
            logger.trace("jBPM event 'beforeVariableChanged'. Process ID: " + process.getId() + ", Process definition ID: "
                    + process.getProcessId() + ", Process name: " + process.getProcessName() + ", Process state: "
                    + process.getState() + ", Parent process ID: " + process.getParentProcessInstanceId()
                    + ", Variable ID: " + event.getVariableId() + ", Variable instance ID: " + event.getVariableInstanceId() + ", Old value: "
                    + (event.getOldValue() == null ? "null" : event.getOldValue().toString())+ ", New value: "+(event.getNewValue() == null ? "null" : event.getNewValue().toString()));
        }
    
        public void afterVariableChanged(ProcessVariableChangedEvent event){
            WorkflowProcessInstance process = (WorkflowProcessInstance) event.getProcessInstance();
            logger.trace("jBPM event 'afterVariableChanged'. Process ID: " + process.getId() + ", Process definition ID: "
                    + process.getProcessId() + ", Process name: " + process.getProcessName() + ", Process state: "
                    + process.getState() + ", Parent process ID: " + process.getParentProcessInstanceId()
                    + ", Variable ID: " + event.getVariableId() + ", Variable instance ID: " + event.getVariableInstanceId() + ", Old value: "
                    + (event.getOldValue() == null ? "null" : event.getOldValue().toString())+ ", New value: "+(event.getNewValue() == null ? "null" : event.getNewValue().toString()));
        }
    
    });
    
  2. 实际上我决定避免在工作流的BPMN定义中使用java logger,但我想我可以通过在每个工作流中传递logger对象作为参数并在我的脚本中使用它来实现BPMN2内的任务。这是我现在能想到的唯一工作。

    Logger logger = LoggerFactory.getLogger("logger name");
    Map<String, Object> arguments = new HashMap<String, Object>();
    arguments.put("logger", logger);
    ProcessInstance processInstance = ksession.startProcess("processName", arguments);
    

答案 1 :(得分:0)

要在JBPM的脚本任务中使用记录器,请按照以下步骤操作:

1.在log.xml文件

中创建记录器名称
<Logger name="com.jbpm.log"  level="DEBUG"> 
<appender-ref ref="consoleAppender" />
</Logger>
  1. 使用完整的类名来获取记录器的实例。

    org.slf4j.Logger logger = null; logger = org.slf4j.LoggerFactory.getLogger("com.jbpm.log"); logger.info("Logger:: Test!!");

  2. 如果没有添加,请添加slf4j jar。