一、各種日誌系統介紹:
Commons Logging
Commons Logging 也就是JCL,提供的是一個日誌接口(Interface),自身提供一個簡單的日誌文件系統,但一般和其他日誌系統組合使用。如:Commons-Logging + Log4j組合使用。
它會通過動態查找機制,在程序運行時自動找出真正使用的日誌庫。
Slf4j
Slf4j 即Simple Logging Facade for Java,和Commons-Logging類似,也是對不同日誌框架提供的一個門面封裝,可以在部署的時候可以通過橋接包接入其他日誌方案來組合使用。
它支持多個參數並通過"{ }"佔位符來進行替換。
Log4j
Log4j 即Log for Java ,經典的一種日誌解決方案。內部把日誌系統抽象封裝成Logger 、appender 、pattern 等實現。我們可以通過配置文件輕鬆的實現日誌系統的管理和多樣化配置。
Log4j 系統的三大板塊:日誌寫入器Logger、日誌輸出終端Appender、日誌佈局模式Layout。其中Appender常用的有ConsoleAppender(輸出到控制檯)、FileAppender(輸出文件)和RollingFileAppender(輸出滾動文件)三種。
在classpath下編寫配置文件log4j.properties,配置相關日誌屬性和格式。
Log4j2
Log4j2 是在Log4j 1.x版本基礎上的一個升級版本。性能得到提升的同時,還能夠自動裝載配置文件,支持參數變量的佔位符功能,可以專門指定事件進行過濾,並且支持插件式架構。
Logback
Logback是由log4j創始人涉及的又一個開源的日誌組件,logback當前分成三個模塊:logback-core,logback- classic和logback-access。logback-core是其它兩個模塊的基礎模塊。logback-classic是log4j的一個 改良版本。此外logback-classic完整實現Slf4j API,使我們可以很方便地更換成其它日誌系統,如:log4j或JDK。logback-access訪問模塊與Servlet容器集成提供通過Http來訪問日誌的功能。
二、Spring MVC + Slf4j + Log4j2 配置步驟:
Maven配置
首先,應在Maven中加載所需依賴包,並通過橋接器將Slf4j和Log4j2組合起來使用。
第一步:配置Spring需要的依賴:(選用“4.0.9.RELEASE”版本)
<dependency>
<groupid>org.springframework/<groupid>
<artifactid>spring-core/<artifactid>
<version>${springframework}/<version>
<exclusions>
<exclusion>
<groupid>commons-logging/<groupid>
<artifactid>commons-logging/<artifactid>
/<exclusion>
/<exclusions>
/<dependency>
<dependency>
<groupid>org.springframework/<groupid>
<artifactid>spring-beans/<artifactid>
<version>${springframework}/<version>
/<dependency>
<dependency>
<groupid>org.springframework/<groupid>
<artifactid>spring-context/<artifactid>
<version>${springframework}/<version>
/<dependency>
<dependency>
<groupid>org.springframework/<groupid>
<artifactid>spring-context-support/<artifactid>
<version>${springframework}/<version>
/<dependency>
<dependency>
<groupid>org.springframework/<groupid>
<artifactid>spring-expression/<artifactid>
<version>${springframework}/<version>
/<dependency>
<dependency>
<groupid>org.springframework/<groupid>
<artifactid>spring-tx/<artifactid>
<version>${springframework}/<version>
/<dependency>
<dependency>
<groupid>org.springframework/<groupid>
<artifactid>spring-web/<artifactid>
<version>${springframework}/<version>
/<dependency>
<dependency>
<groupid>org.springframework/<groupid>
<artifactid>spring-webmvc/<artifactid>
<version>${springframework}/<version>
/<dependency>
<dependency>
<groupid>org.springframework/<groupid>
<artifactid>spring-jdbc/<artifactid>
<version>${springframework}/<version>
/<dependency>
<dependency>
<groupid>org.springframework/<groupid>
<artifactid>spring-jms/<artifactid>
<version>${springframework}/<version>
/<dependency>
注意 : Spring自身的日誌系統是基於Commons-Logging接口的,而我們所採用的是Slf4j接口 + Log4j2組合模式,為了避免衝突,故需在配置依賴中將
Spring中的Commons-Logging取消依賴,如下操作:
<dependency>
<groupid>org.springframework/<groupid>
<artifactid>spring-core/<artifactid>
<version>${springframework}/<version>
<exclusions>
<exclusion>
<groupid>commons-logging/<groupid>
<artifactid>commons-logging/<artifactid>
/<exclusion>
/<exclusions>
/<dependency>
第二步:配置 Slf4j 需要的依賴:(選用“1.7.25”版本)
<dependency>
<groupid>org.slf4j/<groupid>
<artifactid>slf4j-api/<artifactid>
<version>${slf4j}/<version>
/<dependency>
<dependency>
<groupid>org.slf4j/<groupid>
<artifactid>jcl-over-slf4j/<artifactid>
<version>${slf4j}/<version>
<scope>runtime/<scope>
/<dependency>
slf4j-api : Slf4j的核心包,只有日誌的接口,並沒有實現。
jcl-over-slf4j : 橋接器,將JCL的日誌輸出重定向到Slf4j中。
第三步:配置 log4j2 需要的依賴:(選用“2.8.2”版本)
<dependency>
<groupid>org.apache.logging.log4j/<groupid>
<artifactid>log4j-core/<artifactid>
<version>${log4j2}/<version>
<scope>runtime/<scope>
/<dependency>
<dependency>
<groupid>org.apache.logging.log4j/<groupid>
<artifactid>log4j-web/<artifactid>
<version>${log4j2}/<version>
<scope>runtime/<scope>
/<dependency>
<dependency>
<groupid>org.apache.logging.log4j/<groupid>
<artifactid>log4j-api/<artifactid>
<version>${log4j2}/<version>
<scope>runtime/<scope>
/<dependency>
<dependency>
<groupid>org.apache.logging.log4j/<groupid>
<artifactid>log4j-slf4j-impl/<artifactid>
<version>${log4j2}/<version>
<scope>runtime/<scope>
/<dependency>
log4j-slf4j-impl : 將log4j2 和 slf4j進行綁定。
編寫Log4j2 日誌配置文件
- 配置文件格式及讀取優先級:
- Log4j2 配置文件後綴要求為".xml"、".json"或者".jsn"。
- 系統選擇配置文件的優先級為(從先到後):
- (1).classpath下的名為log4j2-test.json 或者log4j2-test.jsn的文件.
- (2).classpath下的名為log4j2-test.xml的文件.
- (3).classpath下名為log4j2.json 或者log4j2.jsn的文件.
- (4).classpath下名為log4j2.xml的文件.
- (5).如果classpath下沒有相關配置文件,則使用默認日誌系統.
- 詳細配置文件解析:
- 要點介紹 :
- 日誌的級別: ALL< Trace < DEBUG < INFO < WARN < ERROR < FATAL < OFF。
- Properties 模塊 : 配置一些全局的屬性值。
- Appenders 模塊 :日誌輸出相關配置。
- Loggers 模塊 : 只有定義了Logger並根據Appender的name屬性引入其中,Appender才會生效。
<configuration>
<properties>
<property>/root/bubble/logs/<property>
<property>/root/bubble/logs/<property>
/<properties>
<appenders>
<console>
<thresholdfilter> onMismatch="DENY" />
<patternlayout> pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %logger{36}:%L [%t] - %msg%n" />
/<patternlayout>/<thresholdfilter>/<console>
<rollingfile> filePattern="${LOG_HOME}/$${date:yyyy-MM}/search-%d{yyyy-MM-dd}-%i.log">
<thresholdfilter> onMismatch="DENY" />
<patternlayout> pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %logger{36}:%L [%t] - %msg%n" />
<policies>
<timebasedtriggeringpolicy> modulate="true" />
<sizebasedtriggeringpolicy>
/<timebasedtriggeringpolicy>/<policies>
<defaultrolloverstrategy>
/<patternlayout>/<thresholdfilter>/<rollingfile>
<rollingfile> fileName="${ERROR_LOG_FILE_NAME}/search-error.log"
filePattern="${ERROR_LOG_FILE_NAME}/$${date:yyyy-MM}/search-error-%d{yyyy-MM-dd}.log">
<thresholdfilter> onMismatch="DENY" />
<patternlayout> pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %logger{36}:%L [%t] - %msg%n" />
<policies>
<timebasedtriggeringpolicy> modulate="true" />
/<timebasedtriggeringpolicy>/<policies>
<defaultrolloverstrategy>
/<patternlayout>/<thresholdfilter>/<rollingfile>
/<appenders>
<loggers>
<logger>
<root>
<appender-ref>
<appender-ref>
<appender-ref>
/<root>
/<loggers>
/<configuration>
測試
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
private static final Logger logger = LoggerFactory.getLogger(Test.class);
....
logger.info("fastjson parse error, the json msg is {}", tempStr);
閱讀更多 吳趙筆記 的文章