自訂 1.6.x 記載代理程式,以支援在協調環境中使用 Log4j 的 Java 應用程式的自訂多行解析功能

本教學示範如何為 Java 應用程式設定 IBM® Cloud Logs 記載代理程式 多行日誌處理,並使用 Log4j 日誌框架配置應用程式的多行日誌處理。 此設定適用於協調環境,例如 IBM Cloud Kubernetes Service 和 Red Hat OpenShift on IBM Cloud,並使用 Helm。 此設定可確保堆疊追蹤和多行日誌在 IBM Cloud Logs 中正確歸類。

本教學需要 IBM Cloud Logs 記載代理程式 1.6.0 或更新版本。

開始之前

在開始使用本教學之前,請檢閱下列資訊,以瞭解 記載代理程式 和多行概念。

本教學也假設您有:

Log4j 設定範例

讓我們假設您的 Java 應用程式的 Log4j 要記錄到控制台 (stdout) 與下列內容相似:

<?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>

此設定會以格式輸出記錄:yyyy-MM-dd HH:mm:ss.SSS [thread] LEVEL logger - message,之後是換行。 多行訊息(例如堆疊追蹤)會顯示在沒有時間戳記前綴的後續行中。 例如:

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) [?:?]

設定多行解析與 Helm

如果您使用 Helm 部署 記載代理程式,您可以在 Helm values.yaml 檔案中設定多行解析。

啟用多行解析

values.yaml 檔案中設定 enableMultilinetrue,以啟動多行處理:

enableMultiline: true

定義多行解析器

values.yaml 檔案的 additionalMultilineParsers 區段下新增自訂多行解析器。

log4j.xml 檔案中定義的模式必須與多行解析器中的 regex 一致,以確保正確的日誌群組。

範例:

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

此 regex 假定每一行新日誌都以格式為 yyyy-MM-dd HH:mm:ss.SSS 的時間戳開始。 第一條規則擷取具有時間戳記的起始行,並移動到延續狀態。 第二條規則會匹配任何不是以時間戳開始的行。

這個方法只是一個範例,讓您知道如何確保多行記錄線(例如 Java 堆疊追蹤和異常)在轉送至 IBM Cloud Logs 之前,先歸類為單一記錄項目。 要達到相同的目的,有不同的方法。

定義多行預處理器

multilinePreprocessor 區段下設定預處理器,將解析器套用至您的日誌。

例如:

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

套用變更。

如果您已安裝先前版本的 記載代理程式,並透過直接在群集中修改配置映射更新了代理程式組態,請在執行 helm upgrade 指令之前,先從群集中複製一份配置映射。 更新 記載代理程式 時,對設定映射所做的任何變更都會被覆蓋。

更新 values.yaml 檔案後,在您的部署上執行下列步驟,套用變更。 這將會重新產生必要的設定。

helm upgrade

驗證您的多行日誌

存取您的 IBM Cloud Logs 範例,並確認您的多行項目(例如堆疊追蹤)已正確分組。

  1. 存取您的 IBM Cloud Logs 實例。

  2. 使用日誌 探索日誌圖示 檢視,驗證您的多行項目是否已正確分組。