IDEA整合日誌框架Log4j2+Slf4j詳細配置過程
日誌框架這麼多,他們之間到底是什麼關係呢?籠統的講就是slf4j是一系列的日誌接口,而log4j2、logback是具體實現了接口功能的日誌框架。現在的主流日誌接口都使用slf4j,而日誌的實現就見仁見智了,至於他們的關係請自行百度,此處選擇log4j2作爲實現框架。網上看到的教程要麼對代碼沒有解釋,對新手不友好;要麼時間比較久遠,跟不上時代。這裏使用新版本並結合大量註釋,力求簡潔明瞭,有什麼問題歡迎留言交流。
運行環境:
- log4j2 2.8.2 + slf4j 1.7.25
- IntelliJ IDEA 2017.2.5
- maven 3.0.5
配置過程
Step 1:導入maven依賴
<properties>
<slf4j.version>1.7.25</slf4j.version>
<log4j.version>2.8.2</log4j.version>
</properties>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${slf4j.version}</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j-impl</artifactId>
<version>${log4j.version}</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-web</artifactId>
<version>${log4j.version}</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>${log4j.version}</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>${log4j.version}</version>
</dependency>
Step 2:添加配置文件
配置文件可以直接在resources文件夾下創建,文件名爲log4j2.xml,log4j2的相關組件會自動掃描log4j2.xml或log4j2.properties(log4j2 同時支持多種屬性配置方式,log4j2.xml或log4j2.properties爲官方指定的配置文件名,具體信息參見官方文檔)。該文件夾是IDEA專門用來存放各種配置文件的地方,如果使用前面所示的文件名就不需要指定配置文件的位置。如果想放在其他文件夾下,則需要在web.xml文件中添加如下配置:
<context-param> <param-name>log4jConfiguration</param-name> <!-- 日誌配置文件路徑,請根據具體項目自行調整 --> <param-value>classpath:conf/log4j2.xml</param-value> </context-param>
我的配置文件log4j2.xml內容如下(此處並沒有將日誌信息輸出到外部文件):
<?xml version="1.0" encoding="utf-8"?>
<!--日誌級別:TRACE < DEBUG < INFO < WARN < ERROR < FATAL,如果設置爲WARN,則低於WARN的信息都不會輸出-->
<!--
status : 這個用於設置log4j2自身內部的信息輸出,可以不設置,當設置成trace時,會看到log4j2內部各種詳細輸出
monitorInterval : Log4j能夠自動檢測修改配置文件和重新配置本身, 設置間隔秒數。此處表示每隔300秒重讀一次配置文件
-->
<Configuration status="ERROR" monitorInterval="300">
<!--<properties>-->
<!--<property name="LOG_HOME">F:\logs</property>-->
<!--<property name="ERROR_LOG_FILE_NAME">error</property>-->
<!--</properties>-->
<Appenders>
<Console name="Console" target="SYSTEM_OUT"> <!-- 定義類型爲Console的Appender -->
<PatternLayout pattern="%d{HH:mm:ss} [%level] %c{10} - %msg%n"/> <!-- 定義類型爲Pattern的Layout -->
</Console>
</Appenders>
<!--定義logger,只有定義了logger並引入上面的appender,appender纔會生效-->
<Loggers>
<Root level="error"> <!-- 定義Root Logger -->
<AppenderRef ref="Console"/> <!-- Root Logger的Appender引用上面定義的Console -->
</Root>
<!--定義名字爲MainLogger的Logger,其日誌級別爲info,info以下級別的信息將不會輸出 -->
<Logger name="MainLogger" level="info" additivity="false">
<AppenderRef ref="Console"/> <!-- Root Logger的Appender引用上面定義的Console -->
</Logger>
</Loggers>
</Configuration>
如果使用log4j2.properties的形式配置log4j2,則參見如下配置(兩個配置文件不屬於同一個項目,所以配置信息略有不同):
# 指定log4j2內部的日誌輸出級別,低於指定級別的日誌將不會輸出,ALL表示輸出所有日誌信息
# 日誌級別:ALL < TRACE < DEBUG < INFO < WARN < ERROR < FATAL < OFF
status = warn
# 配置日誌信息輸出到哪裏:err表示作爲標準錯誤輸出,還可以是一個文件路徑或者一個URL
dest = err
# 指定配置的名稱
name = Log4jPropertiesConfig
#使用“property.* ”來指定下方可能用到的屬性值
property.RollingFileName = target/log/log4j2test.log
property.ConsoleLogLevel = info
filter.threshold.type = ThresholdFilter
filter.threshold.level = debug
# ConsoleAppender:定義輸出到命令行的日誌輸出器
# ThresholdFilter:臨界值過濾器,過濾掉低於指定臨界值的日誌。當日志級別低於臨界值時,日誌輸出會被拒絕
appender.console.type = Console
appender.console.name = Console_OUT
appender.console.layout.type = PatternLayout
appender.console.layout.pattern = %d{yyyy-MM-dd HH:mm:ss} [%p] %c: %msg%n
appender.console.filter.threshold.type = ThresholdFilter
appender.console.filter.threshold.level = ${ConsoleLogLevel}
# RollingFileAppender:輸出到滾動文件的日誌輸出,它會判斷文件是否滿足封存文件的要求,若滿足,則將文件封存並把日誌寫入到下一個滾動文件。
# RollingFileAppender需要TriggeringPolicy來指定觸發封存的條件,還需要RolloverStrategy來告訴輸出器如何封存文件
# 此處使用複合型觸發策略(時間和文件大小),具體配置參考:http://blog.csdn.net/henry115/article/details/78483457
appender.rolling.type = RollingFile
appender.rolling.name = RollingFile
appender.rolling.fileName = ${RollingFileName}
appender.rolling.filePattern = target/log/log1-%d{yy-MM-dd-HH-mm-ss}-%i.log.gz
appender.rolling.layout.type = PatternLayout
appender.rolling.layout.pattern = %d{yyyy-MM-dd HH:mm:ss.SSS} [%p] %C{1.} [%t]: %msg%n
appender.rolling.policies.type = Policies
appender.rolling.policies.time.type = TimeBasedTriggeringPolicy
appender.rolling.policies.time.interval = 12
appender.rolling.policies.time.modulate = true
appender.rolling.policies.size.type = SizeBasedTriggeringPolicy
appender.rolling.policies.size.size=100MB
appender.rolling.strategy.type = DefaultRolloverStrategy
appender.rolling.strategy.max = 10
# 定義名字爲TestController的Logger,其日誌級別爲debug
# Logger日誌信息輸出的目的地由“logger.rolling.appenderRef.rolling.ref”指定
# 當“logger.rolling.additivity”屬性值爲false時,則子Logger只會在自己的appender裏輸出
#logger.rolling.level = debug
logger.rolling.name = MainController
logger.rolling.additivity = false
logger.rolling.appenderRef.rolling.ref = Console_OUT
# 此處指定日誌輸出級別無效,輸出級別由其引用的輸出器指定
rootLogger.level = info
rootLogger.appenderRef.stdout.ref = Console_OUT
Step 3: 在Java文件中使用slf4j打印日誌信息:
此處注意Logger的名稱必須與配置文件中對應
@Controller public class MainController { // 獲取log4j2.xml文件中定義的名爲“MainLogger”的Logger // 如果沒有對應名稱的Logger,則無法使用Logger記錄和輸出日誌信息 private static final Logger log = LoggerFactory.getLogger("MainLogger"); @RequestMapping(value = "/test") public String test(){ log.info("info..."); log.debug("debug..."); log.warn("warn..."); log.error("error..."); return "test"; } }