自訂 1.6.x 記載代理程式 以支援 Java 應用程式的自訂多行解析,在非協調環境中使用 Log4j
本教學示範如何為 Java 應用程式設定 IBM® Cloud Logs 記載代理程式 多行日誌處理,並使用 Log4j 日誌框架配置應用程式的多行日誌處理。 此設定適用於非協調環境,例如 Linux 和 Windows,並會修改設定檔。 此設定可確保堆疊追蹤和多行日誌在 IBM Cloud Logs 中正確歸類。
本教學需要 IBM Cloud Logs 記載代理程式 1.6.2 或更新版本。
開始之前
在開始使用本教學之前,請檢閱下列資訊,以瞭解 記載代理程式 和多行概念。
本教學也假設您有:
本教學中的設定檔可以在您安裝 記載代理程式 時下載套件檔案的地方找到。
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 範例,並確認您的多行項目(例如堆疊追蹤)已正確分組。
-
使用日誌
檢視,驗證您的多行項目是否已正確分組。
分組的記錄資料包含在
log欄位中。