現在公司用log4j2 進行日志記錄,我也看了相關的資料,現在進行記錄學習總結下
整體結構
- Appenders里設置日志的輸出方式、級別和格式
- Loggers里設置全局的級別和綁定appenders里的name
簡單代碼demo
加載依賴
登錄官網,找到maven依賴
<dependencies>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.11.0</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.11.0</version>
</dependency>
</dependencies>
新建一個log4j2.xml
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
</Console>
</Appenders>
<Loggers>
<Root level="TRACE">
<AppenderRef ref="Console" />
</Root>
</Loggers>
</Configuration>
新建一個測試類
Logger logger = LogManager.getLogger(LogManager.ROOT_LOGGER_NAME);
logger.trace("trance level");
logger.debug("debug level");
logger.info("info level");
logger.warn("warn level");
logger.error("error level");
logger.fatal("fatal level");
輸出結果
22:36:42.966 [main] TRACE - trance level
22:36:42.968 [main] DEBUG - debug level
22:36:42.969 [main] INFO - info level
22:36:42.969 [main] WARN - warn level
22:36:42.969 [main] ERROR - error level
22:36:42.969 [main] FATAL - fatal level
細節分析
首先 我們要明白日志的級別
日志級別從低到高分為TRACE < DEBUG < INFO < WARN < ERROR < FATAL,如果設置為WARN,則低於WARN的信息都不會輸出
Configuration
- Configuration為根節點,有一個status屬性,這個屬性表示log4j2本身的日志信息打印級別
Appenders
建議大家去官網看看,現在支持很多種appender,並且官網上也有示例。
Console節點中的PatternLayout定義了輸出日志時的格式
-
%d{HH:mm:ss.SSS} 表示輸出到毫秒的時間
-
%t 輸出當前線程名稱
-
%-5level 輸出日志級別,-5表示左對齊並且固定輸出5個字符,如果不足在右邊補0
-
%logger 輸出logger名稱,因為Root Logger沒有名稱,所以沒有輸出
-
%msg 日志文本
-
%n 換行
其他的參數意義,大家遇到自行搜索
自定義Appender
我們發現這個log4j2是支持我們自定義的Appender的,很好的體現了開閉原則:對擴展支持,對修改關閉。再想想渣渣猿我自己寫的代碼,果然大神們寫的代碼還是很six的,這里不具體展開詳細介紹,我現在對這一塊也不是很熟悉
注意事項
大家最好結合阿里規約中日志的規約,大家自行查看。摘出其中一句話,供大家參考
大量地輸出無效日志,不利於系統性能提升,也不利於快速定位錯誤點。記錄日志時請
思考:這些日志真的有人看嗎?看到這條日志你能做什么?能不能給問題排查帶來好處?