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 non 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 non orchestrés, par exemple Linux et Windows, et modifie le fichier de configuration. 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.2 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 :

  • Une instance IBM Cloud Logs provisionnée et configurée.

  • Le site Agent de journalisation a été déployé dans un environnement non orchestré.

Les fichiers de configuration de ce tutoriel se trouvent à l'endroit où les fichiers du paquet ont été téléchargés lors de l'installation de Agent de journalisation.

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 manuelle de l'analyse multiligne à l'aide d'un fichier de configuration

Si vous configurez le site Agent de journalisation manuellement à l'aide d'un fichier de configuration, vous pouvez configurer l'analyse multiligne en modifiant le fichier de configuration Agent de journalisation approprié.

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.

Définir l'analyseur multi-lignes

Définissez votre analyseur multiligne personnalisé qui correspond au modèle de sortie Log4j. L'expression rationnelle identifie les lignes commençant par l'horodatage comme de nouvelles entrées et traite les lignes suivantes sans horodatage comme des suites de l'entrée précédente. Ajoutez ceci à votre fichier Agent de journalisation parsers.conf.

Exemple :

[MULTILINE_PARSER]
    Name            multiline-java-example
    Type            regex
    Flush_timeout   500
    Rule            "start_state"     "/^(\d+-\d+-\d+ \d+:\d+:\d+\.\d+)(.*)$/"     "cont"
    Rule            "cont"            "/^(?!\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}\.\d{3}).*$/"     "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.

Appliquer l'analyseur syntaxique avec le filtre multiligne

Ajoutez un filtre à votre fichier Agent de journalisation filters.conf pour appliquer l'analyseur personnalisé aux journaux correspondant aux balises de votre application.

Exemple :

[FILTER]
    Name              multiline
    Match             kube.*
    Multiline.key_content log
    Multiline.parser  multiline-java-example
    Emitter_Name      multiline-java

Redémarrez l'agent.

Après avoir mis à jour la carte de configuration, redémarrez l'agent.

  • Linux Pour les environnements Linux, exécutez :

    systemctl daemon-reload && systemctl restart fluent-bit
    
  • Windows Pour les environnements Windows, exécutez :

    sc.exe stop fluent-bit && sc.exe start fluent-bit
    

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.

    Les données d'enregistrement groupées sont incluses dans le champ log.