使用Log4j2記錄和管理Java應用的作業記錄後,您可以使用Log4j2 Appender或Logtail將日誌採集到Log Service,以便於後續的查詢分析。
Log4j概述
Log4j是Apache的一個開放原始碼專案,通過使用Log4j,您可以配置日誌傳輸的目的地,例如控制台、檔案、GUI組件、Socket伺服器、NT的事件記錄器、UNIX Syslog守護進程等;您也可以控制每一條日誌的輸出格式;通過定義每一條日誌資訊的層級,您能夠更加細緻地控制日誌的產生過程。這些可以通過一個設定檔來靈活地進行配置,而不需要修改應用的代碼。Log4j由三個重要的組件構成,如下所示:
日誌格式化器(Layouts)
Layouts控制日誌資訊的格式化方式。常用Layouts有:
Layouts
含義
HTMLLayout
表示日誌輸出格式化為HTML表格形式。
SimpleLayout
表示使用簡單的輸出格式化,格式如預設的INFO層級的訊息。
PatternLayout
根據自訂格式輸出日誌,您可以設定包括時間戳記、記錄層級、線程名、類名、方法名、日誌訊息等元素的排列和格式。
日誌輸出端(Appenders)
Appenders定義了日誌資訊的輸出目的地。您可以配置多個Appender,將日誌發送到不同的地方。常用Appenders有:
Appenders
含義
ConsoleAppender
將日誌輸出到控制台。
FileAppender
將日誌輸出到檔案中。
DailyRollingFileAppender
將日誌輸出到一個檔案,並且每天輸出到新的檔案。
RollingFileAppender
將日誌資訊輸出到一個檔案,並且指定檔案的尺寸,當檔案大小達到指定尺寸時,會自動把檔案改名,同時產生一個新的檔案。
JDBCAppender
將日誌資訊儲存到資料庫中。
日誌記錄器(Loggers)
Loggers定義了日誌記錄的進入點,負責捕獲日誌資訊。每個Logger都會基於其重要性或嚴重程度分配到一個記錄層級。Log4j定義了8個層級的log,優先順序從高到低依次為:OFF、FATAL、ERROR、WARN、INFO、DEBUG、TRACE、 ALL。日誌記錄的層級具有繼承性,子類會記錄父類的所有記錄層級。每種記錄層級的含義如下:
記錄層級
含義
OFF
關閉所有日誌記錄。
FATAL
指出嚴重的錯誤事件,將會導致應用程式的退出。
ERROR
指出雖然發生錯誤事件,但仍然不影響系統的繼續運行。
WARN
表明會出現潛在的錯誤情形。
INFO
一般用在粗粒度層級上,強調應用程式的運行過程。
DEBUG
一般用於調試應用程式時,對診斷問題提供協助。
TRACE
用於對程式追蹤,輸出程式運行中的變數,顯示執行的流程。
ALL
列印所有的日誌記錄。
一個Logger可以對應多個Appender,一個Appender只能對應一個Layout。
前提條件
已建立Project和Logstore。更多資訊,請參見管理Project和管理Logstore。
如果使用Appender方式採集,則必須建立RAM使用者並授予Log ServiceLogstore的寫入許可權,配置許可權的步驟請參見配置許可權助手。
操作步驟
本文以Java語言為樣本,使用Log4j2版本進行示範。通過Log4j其他語言介面,您可以在C、C++、.Net、PL/SQL程式中使用Log4j,其文法和用法與在Java程式中一樣。
步驟一:在專案中添加Log4j2的設定檔
maven工程中引入依賴。
<dependencies> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-api</artifactId> <version>2.23.1</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>2.23.1</version> </dependency> </dependencies>
修改設定檔。
預設會在classpath路徑下尋找設定檔,如果不存在則需要手動建立。下面以log4j2.xml為例,log4j2.xml中定義兩個Appender,分別輸出到控制台和檔案app.log中。定義根日誌器的記錄層級是error,輸出到控制台。定義名為com.example.demo.log的日誌器層級是warn,輸出到檔案中。更多Log4j2配置方式,請參見官網Log4j – Configuring Log4j 2 (apache.org)
<!-- status="WARN",設定Log4j 2自身的內部狀態,而不是應用程式的日誌記錄,它用於在配置過程中捕獲和報告潛在問題。 --> <Configuration status="WARN"> <!-- 定義兩個輸出日誌的目標(Appender) start --> <Appenders> <!-- 定義了一個名為"Console"的控制台輸出Appender,日誌將被列印到系統標準輸出。 --> <Console name="Console" target="SYSTEM_OUT"> <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss:SSS zzz} [%t] %-5level %logger{36} - %msg%n"/> </Console> <!-- 定義了一個名為"MyFile"的檔案輸出Appender,日誌會被寫入到”app.log“這個檔案中。--> <File name="MyFile" fileName="app.log"> <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss:SSS zzz} [%t] %-5level %logger{36} - %msg%n"/> </File> </Appenders> <!-- 定義兩個輸出日誌的目標(Appender) end --> <!-- 配置日誌記錄的行為(Logger) start --> <Loggers> <!-- 定義了名為com.example.demo.log的日誌器,其層級設定為trace。它引用了"MyFile" Appender,即"com.example.demo.log" Logger會將trace及以上的日誌會輸出到它自己的Appender("MyFile")。 --> <Logger name="com.example.demo.log" level="warn"> <AppenderRef ref="MyFile" /> </Logger> <!-- 定義了根日誌器(Root Logger),其層級設定為error。它引用了"Console" Appender,即error及以上的日誌會輸出到控制台。 --> <Root level="error"> <AppenderRef ref="Console" /> </Root> </Loggers> <!-- 配置日誌記錄的行為(Logger) end --> </Configuration>
基本使用。
編寫測試代碼,讀取定義好的Appender,進行日誌輸出,程式碼範例如下:
public void logExampleDemo() { // 擷取名為 "com.example.demo.log" 的 Logger 執行個體 Logger logger = LogManager.getLogger("com.example.demo.log"); // 記錄不同層級的日誌訊息 logger.trace("trace level"); logger.debug("debug level"); logger.info("info level"); logger.warn("warn level"); logger.error("error level"); logger.fatal("fatal level"); }
日誌範例輸出,如下所示。
2024-05-28 13:37:16:295 CST [http-nio-8080-exec-8] TRACE com.example.demo.log - trace level 2024-05-28 13:37:16:296 CST [http-nio-8080-exec-8] DEBUG com.example.demo.log - debug level 2024-05-28 13:37:16:296 CST [http-nio-8080-exec-8] INFO com.example.demo.log - info level 2024-05-28 13:37:16:296 CST [http-nio-8080-exec-8] WARN com.example.demo.log - warn level 2024-05-28 13:37:16:296 CST [http-nio-8080-exec-8] ERROR com.example.demo.log - error level 2024-05-28 13:37:16:296 CST [http-nio-8080-exec-8] FATAL com.example.demo.log - fatal level
步驟二:採集Log4j日誌到Log Service
Log4j2 Appender採集是Log4j2內建的日誌採集方式,對於已整合Log4j2的應用程式,只需進行簡單的配置,即可啟用Appender即時發送日誌,無需寫入伺服器的硬碟。適用於需要即時處理大量日誌資料的巨量資料應用情境。
使用Logtail採集需要在伺服器上安裝Logtail組件,Logtail組件支援多種處理外掛程式。
通過Log4j2 Appender採集Log4j日誌
Maven工程中引入依賴。
<dependency> <groupId>com.google.protobuf</groupId> <artifactId>protobuf-java</artifactId> <version>2.5.0</version> </dependency> <dependency> <groupId>com.aliyun.openservices</groupId> <artifactId>aliyun-log-log4j2-appender</artifactId> <version>0.1.12</version> </dependency>
修改設定檔。
以XML型設定檔
log4j2.xml
為例(不存在則在專案根目錄建立),配置Loghub相關的appender與Logger,例如:<Appenders> <Loghub name="Loghub" project="your project" logStore="your logStore" endpoint="your project endpoint" accessKeyId="your accessKey id" accessKeySecret="your accessKey secret" totalSizeInBytes="104857600" maxBlockMs="0" ioThreadCount="8" batchSizeThresholdInBytes="524288" batchCountThreshold="4096" lingerMs="2000" retries="10" baseRetryBackoffMs="100" maxRetryBackoffMs="100" topic="your topic" source="your source" timeFormat="yyyy-MM-dd'T'HH:mmZ" timeZone="UTC" ignoreExceptions="true"> <PatternLayout pattern="%d %-5level [%thread] %logger{0}: %msg"/> </Loghub> </Appenders> <Loggers> <Root level="warn"> <AppenderRef ref="Loghub"/> </Root> </Loggers>
其中project、logStore、endpoint、accessKeyId、accessKeySecret為必選參數,是必須填寫的。選擇性參數在不填寫的情況下,使用預設值。詳細說明如下:
參數名
參數含義
project
Log Service的Proiect名。
logStore
Log Service的Logstore名。
endpoint
Log Service的公網網域名稱,擷取方式請參見服務存取點。
accessKeyId
使用者身份識別ID,擷取方式,請參見建立AccessKey。
accessKeySecret
用於驗證您擁有該AccessKey ID的密碼。擷取方式,請參見建立AccessKey。
測試demo樣本。
import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; public class Log4j2AppenderExample { private static final Logger LOGGER = LogManager.getLogger(Log4j2AppenderExample.class); public static void main(String[] args) throws InterruptedException { LOGGER.trace("log4j2 trace log"); LOGGER.debug("log4j2 debug log"); LOGGER.info("log4j2 info log"); LOGGER.warn("log4j2 warn log"); LOGGER.error("log4j2 error log", new RuntimeException("Runtime Exception")); Thread.sleep(1000 * 5); } }
通過Logtail採集Log4j日誌
配置Logtail時需要提供檔案路徑,請您保證應用程式記錄檔可正常寫入到記錄檔中。
安裝Logtail
安裝Logtail的操作步驟,請按照安裝Logtail(Linux系統)完成。
配置Logtail採集配置
Log Service提供設定精靈,協助您快速完成Logtail採集配置。操作步驟請按照採集主機文本日誌完成。
步驟三:查看日誌
在Project列表地區,單擊目標Project。
在控制台左側,單擊日誌儲存,在日誌庫列表中單擊目標Logstore。
查看日誌資料是否上傳成功。在Logstore中查詢和分析日誌,單擊消費預覽快速查看日誌。
查詢分析日誌。
輸入查詢和分析語句,然後單擊最近15分鐘,設定查詢和分析的時間範圍。日誌查詢結果如下所示。
Appender方式採集
日誌樣式如下。
level: ERROR location: com.aliyun.openservices.log.log4j.example.Log4jAppenderExample.main(Log4jAppenderExample.java:16) message: error log throwable: java.lang.RuntimeException: xxx thread: main time: 2018-01-02T03:15+0000 log: 0 [main] ERROR com.aliyun.openservices.log.log4j.example.Log4jAppenderExample - error log __source__: xxx __topic__: yyy
在Logstore頁面進行查詢分析。
使用Logtail方式採集
在Logstore頁面進行查詢分析。
您可以輸入查詢語句用於日誌資料的查看、簡單搜尋和過濾。更多資訊,請參見查詢和分析日誌。簡單樣本如下。
統計最近1小時發生錯誤最多的3個位置。
level: ERROR | select location ,count(*) as count GROUP BY location ORDER BY count DESC LIMIT 3
統計最近15分鐘各種記錄層級的日誌條數。
| select level ,count(*) as count GROUP BY level ORDER BY count DESC
相關文檔
使用Logtail採集日誌後,如果預覽頁面為空白或查詢頁面無資料,請按照Logtail採集日誌失敗的排查思路進行排查。在使用Logtail採集日誌時,可能遇到正則解析失敗、檔案路徑不正確、流量超過Shard服務能力等錯誤。查看Logtail採集錯誤的步驟,請參見如何查看Logtail採集錯誤資訊。採集資料常見的錯誤類型請參見Log Service採集資料常見的錯誤類型。
使用Log4j2 Appender採集Log4j日誌的使用執行個體以及常見問題,請查看Log4j2 Appender,以下版本請查看Log4j Appender。
使用Log4j2 Appender採集Log4j日誌時,配置accessKeyId和accessKeySecret,擷取方式,請參見建立AccessKey。配置Log Service提供的訪問網域名稱(Endpoint),請參考服務存取點。