Personnalisation de 1.6.x Agent de journalisation pour prendre en charge l'analyse multiligne personnalisée pour Java applications avec Log4j dans des environnements orchestrés

Ce tutoriel montre comment configurer la gestion des journaux multilignes de IBM® Cloud Logs Agent de journalisation pour une application Java en utilisant le cadre de journalisation de Log4j logging framework. Cette configuration est destinée aux environnements orchestrés, par exemple IBM Cloud Kubernetes Service et Red Hat OpenShift on IBM Cloud, et utilise Helm. Cette configuration garantit que les traces de pile et les journaux multilignes sont correctement regroupés sur IBM Cloud Logs.

Ce tutoriel nécessite le logiciel IBM Cloud Logs Agent de journalisation 1.6.0 ou une version ultérieure.

Avant de commencer

Avant de commencer à utiliser ce didacticiel, passez en revue les informations suivantes pour comprendre les concepts de Agent de journalisation et de multilignes.

Ce tutoriel suppose également que vous avez :

Exemple de configuration de Log4j

Supposons que l'application Java Log4j de journalisation vers la console (stdout) soit similaire à ce qui suit :

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
    <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
        </Console>
    </Appenders>
    <Loggers>
        <Root level="info">
            <AppenderRef ref="Console"/>
        </Root>
    </Loggers>
</Configuration>

Cette configuration produit des journaux au format : yyyy-MM-dd HH:mm:ss.SSS [thread] LEVEL logger - message, suivi d'une nouvelle ligne. Les messages multilignes, tels que les traces de pile, apparaissent sur les lignes suivantes sans préfixe d'horodatage. Exemple :

2025-07-28 10:32:15.423 [main] INFO com.example.logging.Main - Application starting up
2025-07-28 10:32:16.191 [main] INFO com.example.logging.Main - This is an info message
2025-07-18 10:32:18.801 [main] ERROR com.example.logging.Main - This is an error message
java.lang.NullPointerException: null
at com.example.logging.Main.lambda$main$3(Main.java:30) ~[java-log4j-1.0.0.jar:?]
at spark.RouteImpl$1.handle(RouteImpl.java:72) ~[java-log4j-1.0.0.jar:?]
at spark.http.matching.Routes.execute(Routes.java:61) ~[java-log4j-1.0.0.jar:?]
at spark.http.matching.MatcherFilter.doFilter(MatcherFilter.java:134) ~[java-log4j-1.0.0.jar:?]
at spark.embeddedserver.jetty.JettyHandler.doHandle(JettyHandler.java:50) ~[java-log4j-1.0.0.jar:?]
at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:1584) ~[java-log4j-1.0.0.jar:?]
at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141) ~[java-log4j-1.0.0.jar:?]
at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:127) ~[java-log4j-1.0.0.jar:?]
at org.eclipse.jetty.server.Server.handle(Server.java:501) ~[java-log4j-1.0.0.jar:?]
at org.eclipse.jetty.server.HttpChannel.lambda$handle$1(HttpChannel.java:383) ~[java-log4j-1.0.0.jar:?]
at org.eclipse.jetty.server.HttpChannel.dispatch(HttpChannel.java:556) [java-log4j-1.0.0.jar:?]
at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:375) [java-log4j-1.0.0.jar:?]
at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:273) [java-log4j-1.0.0.jar:?]
at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:311) [java-log4j-1.0.0.jar:?]
at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:105) [java-log4j-1.0.0.jar:?]
at org.eclipse.jetty.io.ChannelEndPoint$1.run(ChannelEndPoint.java:104) [java-log4j-1.0.0.jar:?]
at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:806) [java-log4j-1.0.0.jar:?]
at org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.run(QueuedThreadPool.java:938) [java-log4j-1.0.0.jar:?]
at java.lang.Thread.run(Unknown Source) [?:?]

Configuration de l'analyse syntaxique multiligne avec Helm

Si vous déployez le site Agent de journalisation à l'aide de Helm, vous pouvez configurer l'analyse multiligne dans le fichier Helm values.yaml.

Activer l'analyse multiligne

Définissez enableMultiline à true dans votre fichier values.yaml pour activer le traitement multiligne :

enableMultiline: true

Définir l'analyseur multi-lignes

Ajoutez un analyseur multiligne personnalisé sous la section additionalMultilineParsers dans votre fichier values.yaml.

Il est important que le motif défini dans le fichier log4j.xml corresponde à l'expression rationnelle de l'analyseur multiligne afin de garantir un regroupement correct des journaux.

Exemple :

additionalMultilineParsers:
  - name: multiline-java-example
    type: regex
    flush_timeout: 500
    rules:
      - state: start_state
        regex: '/^(\d+-\d+-\d+ \d+:\d+:\d+\.\d+)(.*)$/'
        next_state: cont
      - state: cont
        regex: '/^(?!\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}\.\d{3}).*$/'
        next_state: cont

L'expression rationnelle suppose que chaque nouvelle ligne de journal commence par un horodatage au format yyyy-MM-dd HH:mm:ss.SSS. La première règle capture les lignes de départ avec des horodatages et passe à un état de continuation. La deuxième règle s'applique à toute ligne ne commençant pas par un horodatage.

Cette approche n'est qu'un exemple pour vous montrer comment s'assurer que les lignes d'enregistrement multiples, telles que les traces de pile et les exceptions de Java, sont regroupées en une seule entrée d'enregistrement avant de les transmettre à IBM Cloud Logs. Il existe différentes manières de réaliser la même chose.

Définir le préprocesseur multiligne

Configurez un préprocesseur dans la section multilinePreprocessor pour appliquer l'analyseur à vos journaux.

Exemple :

multilinePreprocessor:
  - name: multiline
    multiline.parser: multiline-java-example
    multiline.key_content: log

Appliquez les modifications.

Si vous avez installé une version précédente de Agent de journalisation et que vous avez mis à jour la configuration de l'agent en modifiant la carte de configuration directement dans le cluster, faites une copie de votre carte de configuration à partir du cluster avant d'exécuter la commande helm upgrade. Lorsque le site Agent de journalisation est mis à jour, toutes les modifications apportées à la carte de configuration sont écrasées.

Après avoir mis à jour le fichier values.yaml, appliquez les modifications en exécutant ce qui suit sur votre déploiement. Cela régénérera les configurations nécessaires.

helm upgrade

Vérifiez vos journaux multilignes

Accédez à votre instance IBM Cloud Logs et confirmez que vos entrées multilignes (par exemple, les traces de pile) sont regroupées correctement.

  1. Accédez à votre instance IBM Cloud Logs.

  2. En utilisant la vue Journaux Icône d'exploration des journaux, vérifiez que vos entrées multilignes sont correctement groupées.