使用Log4j2記錄和管理Java應用的運行日志后,您可以使用Log4j2 Appender或Logtail將日志采集到日志服務,以便于后續的查詢分析。
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用戶并授予日志服務Logstore的寫入權限,配置權限的步驟請參見配置權限助手。
操作步驟
本文以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日志到日志服務
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
日志服務的Proiect名。
logStore
日志服務的Logstore名。
endpoint
日志服務的公網域名,獲取方式請參見服務接入點。
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采集配置
日志服務提供配置向導,幫助您快速完成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采集錯誤信息。采集數據常見的錯誤類型請參見日志服務采集數據常見的錯誤類型。
使用Log4j2 Appender采集Log4j日志的使用實例以及常見問題,請查看Log4j2 Appender,以下版本請查看Log4j Appender。
使用Log4j2 Appender采集Log4j日志時,配置accessKeyId和accessKeySecret,獲取方式,請參見創建AccessKey。配置日志服務提供的訪問域名(Endpoint),請參考服務接入點。