Chapitre 14. Journalisation

Le mécanisme de journalisation vous permet de stocker des informations sur l'exécution d'une instance de processus. Il est fourni par un listener spécial qui écoute le moteur de processus pour être à l'affut de tout événement pertinent à journaliser, de façon à ce que l'information puisse être stockée séparémment de l'information non journlaisée dans une base de données intégrée (h2) ou dans une source de données connectée qui utilise JPA ou Hibernate.
Le module jbpm-audit fournit le listener de l'événement et vous permet également de stocker des informations liées aux processus directement dans une base de données en utilisant JPA ou Hibernate. Les données des entités suivantes sont stockées comme suit :
  • Instance de processus processinstancelog
  • Instance d'élément nodeinstancelog
  • Instance de variable variableinstancelog

Tableau 14.1. Champs de la table de ProcessInstanceLog

ChampDescriptionNullable
id
La clé primaire de l'entité de journalisation
Non
end_date
La date de fin de l'instance du processus
Oui
processid
Le nom (id) du processus sous-jacent
Oui
processinstanceid
L'id de l'instance du processus
Non
start_date
La date de démarrage de l'instance du processus
Oui
status
Le statut de l'instance du processus
Oui
parentProcessInstanceId
L'id d'instance de processus de l'instance de processus parent si tel est le cas
Oui
résultat
Le résultat de l'instance de processus (comme des information de fin de processus, comme un code d'erreur)
Oui

Tableau 14.2. Champs de la table de NodeInstanceLog

ChampDescriptionNullable
id
La clé primaire de l'entité de journalisation
Non
log_date
La date de l'événement
Oui
nodeid
L'id du noeud de l'élément de processus sous-jacent
Oui
nodeinstanceid
L'id de l'instance de noeud
Oui
nodename
Le nom du noeud sous-jacent
Oui
processid
L'id du processus sous-jacent
Oui
processinstanceid
L'id de l'instance de processus parente
Non
type
Le type d'événement (0 = enter event, 1 = exit event)
Non

Tableau 14.3. Les champs de la table de VariableInstanceLog

ChampDescriptionNullable
id
La clé primaire de l'entité de journalisation
Non
log_date
La date de l'événement
Oui
processid
Le nom (id) du processus sous-jacent
Oui
processinstanceid
L'id de l'instance du processus
Non
value
La valeur de la variable au moment de la journalisation
Oui
variableid
La variable est définie dans la définition du processus
Oui
variableinstanceid
l'id de l'instance de la variable
Oui
résultat
Le résultat de l'instance de processus (comme des information de fin de processus, comme un code d'erreur)
Oui
Si nécessaire, définir votre propre modèle d'informations personnalisé et utiliser les listeners d'événement de processus pour extraire l'information.

14.1. Journalisation des événements dans la base de données

Pour journaliser un événement qui a lieu pendant le runtime d'une instance de processus, une instance d'élément, ou une instance de variable, vous devez procéder ainsi :
  1. Mapper les classes de journalisation dans la source de données, de façon à ce que la source de données présentée accepte les entrées de journalisation. Dans Red Hat JBoss EAP, éditez les propriétés de sources de données dans le fichier persistence.xml.

    Exemple 14.1. Les classes ProcessInstanceLog, NodeInstanceLog et VariableInstanceLog activées pour processInstanceDS

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <persistence  version="1.0"  xsi:schemaLocation=
        "http://java.sun.com/xml/ns/persistence
         http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd
         http://java.sun.com/xml/ns/persistence/orm
         http://java.sun.com/xml/ns/persistence/orm_1_0.xsd"
      xmlns:orm="http://java.sun.com/xml/ns/persistence/orm"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xmlns="http://java.sun.com/xml/ns/persistence">
    
      <persistence-unit name="org.jbpm.persistence.jpa">
        <provider>org.hibernate.ejb.HibernatePersistence</provider>
        <jta-data-source>jdbc/processInstanceDS</jta-data-source>
        <class>org.drools.persistence.info.SessionInfo</class>
        <class>org.jbpm.persistence.processinstance.ProcessInstanceInfo</class>
        <class>org.drools.persistence.info.WorkItemInfo</class>
        <class>org.jbpm.process.audit.ProcessInstanceLog</class>
        <class>org.jbpm.process.audit.NodeInstanceLog</class>
        <class>org.jbpm.process.audit.VariableInstanceLog</class>
    
        <properties>
          <property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect"/>
          <property name="hibernate.max_fetch_depth" value="3"/>
          <property name="hibernate.hbm2ddl.auto" value="update"/>
          <property name="hibernate.show_sql" value="true"/>
          <property name="hibernate.transaction.manager_lookup_class"
                    value="org.hibernate.transaction.BTMTransactionManagerLookup"/>
        </properties>
      </persistence-unit>
    </persistence>
    
  2. Enregistrer in logger dans votre session Kie.

    Exemple 14.2. Importer les loggers

    import org.jbpm.process.audit.AuditLogService;
    import org.jbpm.process.audit.AuditLoggerFactory;
    import org.jbpm.process.audit.AuditLoggerFactory.Type;
    import org.jbpm.process.audit.JPAAuditLogService;
    ...
    

    Exemple 14.3. Enregistrer un logger dans une session Kie

    @PersistenceUnit(unitName = PERSISTENCE_UNIT_NAME)
      private EntityManagerFactory emf;
    
      private AuditLogService auditLogService;
    @PostConstruct
      public void configure() {
      
      auditLogService = new JPAAuditLogService(emf);
      ((JPAAuditLogService) auditLogService).setPersistenceUnitName(PERSISTENCE_UNIT_NAME);
      
      if( emf == null ) { 
      ((JPAAuditLogService) auditLogService).setPersistenceUnitName(PERSISTENCE_UNIT_NAME);
      }
      
      RuntimeEngine runtime = singletonManager.getRuntimeEngine(EmptyContext.get());
      KieSession ksession = runtime.getKieSession();
      AuditLoggerFactory.newInstance(Type.JPA, ksession, null);
    
      }
    
  3. En option, appeler la méthode addFilter sur le logger pour filtrer les informations inutiles. Seules les informations acceptées par tous les filtres apparaissent dans la base de données.
  4. Les classes de logger peuvent être visualisées dans la vue d'auditing :
    <dependency>
    	<groupId>org.jbpm</groupId>
    	<artifactId>jbpm-audit</artifactId>
    	<version>6.0.1.Final</version>
    </dependency>