Java et AUDIT_TRAIL Log

Bien souvent on est intéressé par le fait d’accéder directement aux logs des instances BPEL sans forcément utiliser la console.
Ces données sont accessibles, mais compressé, encodées… jamais simple à obtenir…
Nous avions vu dans un précédent article comment accéder à la majorité des informations de ce type dans les différentes tables concernées.
Cet article fait le focus sur la table AUDIT_TRAIL et une récupération totalement basée sur du Java.


Table AUDIT_TRAIL, Colonne Log

La table AUDIT_TRAIL stocke les éléments correspondant aux logs des composants BPEL. Ces informations sont décomposées potentiellement en plusieurs lignes, dont l’ordre sera déterminé par le COUNT_ID.

schéma relation console / tables
schéma relation console / tables

Cette décomposition a pour principal objectif une amélioration des performances, en permettant notamment à la console de récupérer l’ensemble du log par morceaux (comme on peut le voir quand on est dans les logs d’un BPEL, ceux-ci se chargent au fur à mesure que l’on descend l’ascenseur du navigateur).
Le principal problème est que ces informations sont stockées dans la colonne LOG, et que celle-ci est d’un type que l’on manipule rarement : RAW. Difficile de savoir exactement comment lire son contenu…
AuditTrail_01
Schéma table AUDIT_TRAIL

Dans un précédent article, nous étions passés par la création d’une fonction PL/SQL, qui devait être au préalable créée sur la base. Bien qu’utile, cette solution peut poser plusieurs problèmes en soi :

  • Il n’est pas forcément souhaitable de créer une procédure sur certains environnements, telle que la production.
  • La décompression réalisée est faite par la procédure : transfert des informations extraites plus couteuse

Afin de remédier à ces problématiques, il semblait plus intéressant et pratique d’effectuer tout le traitement dans notre code JAVA.

Explication récupération par JAVA

Afin d’obtenir les informations que l’on souhaite, nous interrogeons la table à l’aide de la requête suivante, pour laquelle nous avons au préalable récupéré une CIKEY, identifiant une instance d’un processus BPEL :

SELECT * FROM AUDIT_TRAIL where cikey = '[MYCIKEY]' order by COUNT_ID
AuditTrail_02
Exemple de résultat de requête

Nous récupérons les résultats de cette requête classé par COUNT_ID, et en récupérant les données de la colonne LOG comme étant de type Bytes dans le ResultSet :

resultSet.getBytes("LOG")

Ensuite nous avons besoin de récupérer les informations qui sont compressées. Pour l’ensemble du log nous pouvons concaténer l’ensemble des données LOG d’une instance. Nous allons utiliser une fonction chargée de décompresser l’information avec gzip :

public static byte[] unpackRaw(byte[] b) {
    ByteArrayOutputStream outBuffer = new ByteArrayOutputStream();
    ByteArrayInputStream inBuffer = new ByteArrayInputStream(b);
    try {
        GZIPInputStream gzip = new GZIPInputStream(inBuffer);
        byte[] tmpBuffer = new byte[256];
        int n;
        while ((n = gzip.read(tmpBuffer)) >= 0)
            outBuffer.write(tmpBuffer, 0, n);
    }
    catch (IOException e) {
       System.err.println(e);
    }
    return outBuffer.toByteArray();
}

A partir de ce stade nous obtenons l’information décompressée, qui se trouve être une String contenant le XML, par exemple :

<event sid="0" cat="2" n="0" date="2014-06-18T16:31:09.689+02:00" type="2"><message><![CDATA[New instance of BPEL process "1.0" initiated (#
…
<event sid="BpPrc0.1" cat="2" n="92" date="2014-06-18T16:02:43.778+02:00" type="2"><message><![CDATA[BPEL process instance "1190574" completed]]></message></event>

Il est alors possible de la parser pour pouvoir la manipuler selon vos besoins (DOM, SAX…)

Astuce :
Le XML à disposition n’est pas forcément parsable en l’état : ajouter en tête et fin de XML une balise racine pour permettre au parser de ne pas recontrer de problème !

Conclusion

Avec cette solution supplémentaire, les accès aux différents logs sont quasiment tous possible. Via du code Java, vous serez en mesure de couvrir tous les cas d’utilisation possibles pour vous simplifier les tâches d’administration : récupération input, analyse de logs, analyse d’instances…

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *