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

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

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

開始之前

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

本教學也假設您有:

  • 已配置的 IBM Cloud Logs 實例。

  • 記載代理程式 部署在非協調環境中。

本教學中的設定檔可以在您安裝 記載代理程式 時下載套件檔案的地方找到。

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

使用設定檔手動設定多行解析

如果您使用設定檔手動設定 記載代理程式,您可以透過編輯適當的 記載代理程式 設定檔來設定多行解析。

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

定義多行解析器

定義符合 Log4j 輸出模式的自訂多行解析器。 此 regex 將以時間戳記開始的行識別為新的項目,並將後續沒有時間戳記的行視為前一個項目的延續。 將此新增至 記載代理程式 parsers.conf 檔案。

範例:

[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"

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

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

使用多行篩選器套用解析器

在 記載代理程式 filters.conf 檔案中加入過濾器,將自訂解析器套用至符合應用程式標籤的日誌。

例如:

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

重新啟動代理程式

更新配置映射後,重新啟動代理程式。

  • Linux 對於 環境,請執行:Linux

    systemctl daemon-reload && systemctl restart fluent-bit
    
  • Windows 對於 Windows 環境,執行:

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

驗證您的多行日誌

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

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

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

    分組的記錄資料包含在 log 欄位中。