標籤:

log4j2初體驗

以前用過兩個日誌框架log4j和logback,現在公司項目使用log4j2,於是自己搭建項目嘗試用下。我覺得必須要有自己私人的一個藍本項目,便於自己做研究,如果用公司的項目,會覺得很重,而且改回來再改回去會很麻煩。

首先用IntelliJ IDEA新建一個maven工程,骨架選擇maven-archetype-webapp,注意maven配置文件的位置是否正確。建立完以後,新建java源文件夾,注意源文件夾是淺藍色的。

然後需要在pom.xml添加依賴。這需要我們知道log4j2都需要哪些jar。先回憶下之前使用的logback都使用哪些包。

  1. slf4j-api
  2. logback-core
  3. logback-classic(已含有對slf4j的集成包)

自己在2015年花了不少時間去看這個日誌框架的源碼,積累了一些看開源代碼的經驗。與之類似,log4j2需要的jar如下:

  1. slf4j-api
  2. log4j-api
  3. log4j-core
  4. log4j-slf4j-impl (用於log4j2與slf4j集成)

多了一個橋接的jar,從名字上也可以推測出來。

兩個框架的門面都是當前最流行的slf4j。

<dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-api</artifactId> <version>2.2</version></dependency><dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>2.2</version></dependency><dependency> <!-- 橋接:告訴Slf4j使用Log4j2 --> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-slf4j-impl</artifactId> <version>2.2</version></dependency><dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.1</version></dependency>

其次是日誌的配置文件log4j2,在resouces目錄下。

log4j2的配置文件後綴名只能為 .xml, .json或者 .jsn, 在默認的情況,系統選擇configuration文件的優先順序如下:

  1.classpath下名為 log4j2-test.json 或者log4j2-test.jsn文件

  2.classpath下名為log4j2-test.xml

  3.classpath下名為 log4j2.json 或者log4j2.jsn文件

  4.classpath下名為log4j2.xml

這裡用最簡單的控制台輸出。

<?xml version="1.0" encoding="UTF-8"?><Configuration status="INFO"> <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="info"> <AppenderRef ref="Console" /> </Root> </Loggers></Configuration>

測試代碼非常簡單:

package com.meituan.research;import org.slf4j.Logger;import org.slf4j.LoggerFactory;public class Check { public static void main(String[] args) { Logger logger = LoggerFactory.getLogger(Check.class); logger.info("logger name={}",logger.getName()); logger.info("logger Class={}",logger.getClass().getName()); }}

輸出結果:

09:52:45.962 [main] INFO com.meituan.research.Check - logger name=com.meituan.research.Check09:52:45.963 [main] INFO com.meituan.research.Check - logger Class=org.apache.logging.slf4j.Log4jLogger

寫到這裡,其實可以告一段落,但在實踐中總是能發現更多的問題。

這個問題是maven依賴版本衝突。maven相當於一個平台,比如吸納草寇的梁山泊,把大家聚齊起來,組成一個工具庫。當這麼多jar,maven是怎麼樣管理呢?

首先要識別jar。任何一個jar,在maven看來都由三部分組成。

<groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version>1.7.1</version>

不難發現,明明只是引入了一個jar,怎麼發現了好幾個jar呢?

這是因為你引入的jar本身也是由maven打包而成的,這個jar本身也會依賴其他的jar,所以會產生一顆依賴樹——你依賴的不是一個jar,而是以它為根的一顆依賴樹。當有多顆依賴樹時,jar往往會產生版本衝突,那到底maven會選擇哪個jar呢?

  1. 依賴路徑短的優先。(想想其中的設計原理)
  2. 如果依賴路徑深度相同,那麼後者會覆蓋前者。

怎麼解決依賴版本衝突呢?

  1. 單獨聲明依賴,而不是間接依賴。
  2. 在依賴中使用<exclusions> 剔除不依賴的jar

更多Java日誌參考:log(二) - java中log體系再討論

關於maven:Maven提高篇系列之(五)--處理依賴衝突 - 無知者雲 - 博客園

參考:log4j2配置文件解讀 - 溫一壺清酒 - 博客園


推薦閱讀:

鋼鐵雄心4開發日誌 | 3/28 1.52版本號更新#2以及MOD製作特色內容
絕對路勁&查看日誌
歐陸風雲4開發日誌 | 4/3 新的政體機制與政府改革
鋼鐵雄心4開發日誌 | 3/15 1.5.1 版本號測試補丁更新(新增內容)
基於阿里雲實現遊戲數據運營(附Demo)

TAG:日誌 |