Anpassung von 1.6.x Protokollierungsagent zur Unterstützung von benutzerdefiniertem mehrzeiligem Parsing für Java Anwendungen mit Log4j in orchestrierten Umgebungen
Dieses Tutorial zeigt, wie man die IBM® Cloud Logs Protokollierungsagent mehrzeilige Protokollierung für eine Java Anwendung mit Hilfe des Log4j logging-Framework. Diese Konfiguration ist für orchestrierte Umgebungen, zum Beispiel IBM Cloud Kubernetes Service und Red Hat OpenShift on IBM Cloud, und verwendet Helm. Diese Konfiguration stellt sicher, dass Stack Traces und mehrzeilige Logs in IBM Cloud Logs korrekt gruppiert werden.
Für dieses Tutorial ist die Website IBM Cloud Logs Protokollierungsagent 1.6.0 oder höher erforderlich.
Vorbereitende Schritte
Bevor Sie mit diesem Lernprogramm beginnen, sollten Sie die folgenden Informationen lesen, um die Konzepte von Protokollierungsagent und Multiline zu verstehen.
Diese Anleitung setzt außerdem voraus, dass Sie über die entsprechenden Kenntnisse verfügen:
-
Eine bereitgestellte und konfigurierte IBM Cloud Logs-Instanz.
-
Die Protokollierungsagent wird in einer orchestrierten Umgebung eingesetzt.
-
Kubernetes Service IBM Cloud Kubernetes Service
-
Red Hat OpenShift on IBM Cloud Red Hat OpenShift on IBM Cloud
-
Beispielkonfiguration Log4j
Nehmen wir an, dass Ihre Anwendung Java Log4j zur Protokollierung auf der Konsole (stdout) ähnlich wie folgt aussieht:
<?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>
Diese Konfiguration gibt Protokolle im Format aus: yyyy-MM-dd HH:mm:ss.SSS [thread] LEVEL logger - message, gefolgt von einem Zeilenumbruch. Mehrzeilige Meldungen, wie z. B. Stack Traces, erscheinen in den nachfolgenden Zeilen ohne
Zeitstempelpräfix. Zum Beispiel:
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) [?:?]
Konfigurieren des mehrzeiligen Parsing mit Helm
Wenn Sie Protokollierungsagent mit Helm bereitstellen, können Sie die mehrzeilige Analyse in der Datei Helm values.yaml konfigurieren.
Mehrzeiliges Parsing einschalten
Setzen Sie enableMultiline in Ihrer Datei values.yaml auf true, um die mehrzeilige Verarbeitung zu aktivieren:
enableMultiline: true
Definieren Sie den mehrzeiligen Parser
Fügen Sie einen benutzerdefinierten mehrzeiligen Parser unter dem Abschnitt additionalMultilineParsers in Ihrer Datei values.yaml hinzu.
Es ist wichtig, dass das in der Datei log4j.xml definierte Muster mit der Regex im mehrzeiligen Parser übereinstimmt, um eine korrekte Protokollgruppierung zu gewährleisten.
Beispiel:
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
Die Regex geht davon aus, dass jede neue Protokollzeile mit einem Zeitstempel im Format yyyy-MM-dd HH:mm:ss.SSS beginnt. Die erste Regel erfasst Anfangszeilen mit Zeitstempeln und geht in einen Fortsetzungszustand über. Die zweite
Regel entspricht jeder Zeile, die nicht mit einem Zeitstempel beginnt.
Dieser Ansatz ist nur ein Beispiel, um Ihnen zu zeigen, wie Sie sicherstellen können, dass mehrzeilige Protokollzeilen, wie Java Stack Traces und Exceptions, als ein einziger Protokolleintrag gruppiert werden, bevor sie an IBM Cloud Logs weitergeleitet werden. Es gibt verschiedene Möglichkeiten, das Gleiche zu erreichen.
Definieren Sie den mehrzeiligen Präprozessor
Konfigurieren Sie einen Präprozessor im Abschnitt multilinePreprocessor, um den Parser auf Ihre Protokolle anzuwenden.
Zum Beispiel:
multilinePreprocessor:
- name: multiline
multiline.parser: multiline-java-example
multiline.key_content: log
Wenden Sie die Änderungen an.
Wenn Sie eine frühere Version von Protokollierungsagent installiert haben und die Agentenkonfiguration durch Änderung der config map direkt im Cluster aktualisiert haben, erstellen Sie eine Kopie Ihrer config map aus dem Cluster, bevor Sie den
Befehl helm upgrade ausführen. Wenn die Protokollierungsagent aktualisiert wird, werden alle an der Config Map vorgenommenen Änderungen überschrieben.
Nachdem Sie die Datei values.yaml aktualisiert haben, wenden Sie die Änderungen an, indem Sie die folgenden Schritte für Ihre Bereitstellung ausführen. Dadurch werden die erforderlichen Konfigurationen neu erstellt.
helm upgrade
Überprüfen Sie Ihre mehrzeiligen Protokolle
Rufen Sie Ihre Instanz IBM Cloud Logs auf und überprüfen Sie, ob Ihre mehrzeiligen Einträge (z. B. Stack Traces) korrekt gruppiert sind.
-
Verwenden des Symbols „ Protokolle
die Protokollansicht und überprüfen Sie, ob Ihre mehrzeiligen Einträge richtig gruppiert sind.