Java知名的日誌有不少,好比:JUL、Log4j、JCL、SLF4J、Logback、Log4j2,那麼這些日誌框架之間有着怎樣的關係?誕生的緣由又是解決什麼問題?下面一塊兒來看。html
Java有本身的日誌框架JUL(Java Util Logging)在java.util.logging下,由於對開發者不友好,使用成本過高和日誌級別分類不清晰的問題,全部不多有開發者用。java
由於JUL的缺陷問題,這就給了Log4j機會,全部Log4j一經推出就迅速風靡全球。git
JCL是Jakarta Commons-Logging的縮寫,Jakarta在這裏指的是一個組織,而不是印度的首都雅加達,Jakarta,一個早期的Apache開源項目,用於管理各個Java子項目,諸如Tomcat, Ant, Maven, Struts, JMeter, Velocity, JMeter, Commons等。2011年12月,在全部子項目都被遷移爲獨立項目後,Jakarta名稱就再也不使用了。github
JCL誕生的初衷是由於Java自身的一些包用了JUL,而Log4j用戶使用的有不少,那麼JCL就是提供一套API來實現不一樣Logger之間的切換。web
SLF4J(Simple Logging Facade For Java)簡單日誌門面,和JCL功能相似,但JCL有一個致命的缺點就是算法複雜,出現問題難以排除,而SLF4J的誕生就是爲了解決JCL的缺點。算法
值得一提的是SLF4J的做者就是Log4j的做者。spring
Logback是Log4j的做者的另外一個開源日誌組件,與Log4j相比,Logback從新了內核,使它的性能提高了不少,大約是Log4j的10倍,同時佔用更小的內存,而且完整的實現了SLF4J API是你能夠很方便的切換日誌框架。apache
Log4j2有着和Logback相同的功能,但又有本身單用的功能,好比:插件式結構、配置文件優化、異步日誌等。springboot
Log4j2是Log4j的升級,它比其前身Log4j 1.x提供了重大改進,並提供了Logback中可用的許多改進,同時修復了Logback架構中的一些固有問題。架構
從GitHub的更新日誌來看,Logback已經有半年沒有更新了,而做爲知名組織的Apache下的Log4j2的更新倒是很是活躍的,Log4j 1.x 於2015年8月中止維護更新了。
GitHub地址
Logback:https://github.com/qos-ch/logback
log4j2:https://github.com/apache/logging-log4j2
本文分別來看Logback和Log4j2在Spring Boot中的實現。
開發環境
Spring Boot默認集成了Logback,能夠開箱即用,很是方便。由於spring-boot-starter-logging是Logback的日誌實現,而Spring Boot啓動項spring-boot-starter又依賴了spring-boot-starter-logging,因此Spring Boot就默認集成了Logback,包依賴以下圖:
日誌是默認控制檯輸出的,咱們程序啓動的時候就使用Logback,以下圖所示:
日誌組成解讀:
日期和時間:毫秒精度,易於排序
---
分隔符日誌具體信息
若是須要輸出日誌到文件,只須要在application.properties配置文件設置:logging.file或logging.path,示例以下:
logging.level.root=info logging.file=D:\\log\\my.log
能夠經過設置日誌的級別,忽略更低級別的日誌輸出。
注意: logging.file和logging.path設置一個屬性便可,若是兩個都設置,則以logging.file爲主,logging.path無效。
日誌文件容量設置:使用「logging.file.max-history」屬性爲日誌最大容量設置,默認10M超過則分割爲多個文件。
日誌服務在ApplicationContext建立前就初始化了,因此經過設置屬性和傳統的配置XML文件,能夠對日誌進行管理和控制。
只須要在src/main/resources下,建立好約定名稱的XML文件,便可完成對日誌系統的設置,不一樣的日誌系統有不一樣的約定名稱,以下列表:
日誌 | 名稱 |
---|---|
logback | logback-spring.xml, logback-spring.groovy, logback.xml, 或者 logback.groovy |
log4j2 | log4j2-spring.xml 或者 log4j2.xml |
Spring Boot官方建議使用「-spring」的命名規則,進行日誌配置,如:logback-spring.xml而不是logback.xml。
固然你也能夠自定義日誌名稱,只須要在application.properties配置便可,代碼以下:
logging.config=classpath:logging-config.xml
來看一個logback-spring.xml示例文件:
<?xml version="1.0" encoding="UTF-8"?> <configuration> <!-- 日誌根目錄--> <springProperty scope="context" name="LOG_HOME" source="logging.path" defaultValue="/data/logs/spring-boot-logback"/> <!-- 日誌級別 --> <springProperty scope="context" name="LOG_ROOT_LEVEL" source="logging.level.root" defaultValue="DEBUG"/> <!-- 標識這個"STDOUT" 將會添加到這個logger --> <springProperty scope="context" name="STDOUT" source="log.stdout" defaultValue="STDOUT"/> <!-- 日誌文件名稱--> <property name="LOG_PREFIX" value="spring-boot-logback" /> <!-- 日誌文件編碼--> <property name="LOG_CHARSET" value="UTF-8" /> <!-- 日誌文件路徑+日期--> <property name="LOG_DIR" value="${LOG_HOME}/%d{yyyyMMdd}" /> <!--對日誌進行格式化--> <property name="LOG_MSG" value="- | [%X{requestUUID}] | [%d{yyyyMMdd HH:mm:ss.SSS}] | [%level] | [${HOSTNAME}] | [%thread] | [%logger{36}] | --> %msg|%n "/> <!--文件大小,默認10MB--> <property name="MAX_FILE_SIZE" value="50MB" /> <!-- 配置日誌的滾動時間 ,表示只保留最近 10 天的日誌--> <property name="MAX_HISTORY" value="10"/> <!--輸出到控制檯--> <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <!-- 輸出的日誌內容格式化--> <layout class="ch.qos.logback.classic.PatternLayout"> <pattern>${LOG_MSG}</pattern> </layout> </appender> <!--輸出到文件--> <appender name="0" class="ch.qos.logback.core.rolling.RollingFileAppender"> </appender> <!-- 定義 ALL 日誌的輸出方式:--> <appender name="FILE_ALL" class="ch.qos.logback.core.rolling.RollingFileAppender"> <!--日誌文件路徑,日誌文件名稱--> <File>${LOG_HOME}/all_${LOG_PREFIX}.log</File> <!-- 設置滾動策略,當天的日誌大小超過 ${MAX_FILE_SIZE} 文件大小時候,新的內容寫入新的文件, 默認10MB --> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!--日誌文件路徑,新的 ALL 日誌文件名稱,「 i 」 是個變量 --> <FileNamePattern>${LOG_DIR}/all_${LOG_PREFIX}%i.log</FileNamePattern> <!-- 配置日誌的滾動時間 ,表示只保留最近 10 天的日誌--> <MaxHistory>${MAX_HISTORY}</MaxHistory> <!--當天的日誌大小超過 ${MAX_FILE_SIZE} 文件大小時候,新的內容寫入新的文件, 默認10MB--> <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> <maxFileSize>${MAX_FILE_SIZE}</maxFileSize> </timeBasedFileNamingAndTriggeringPolicy> </rollingPolicy> <!-- 輸出的日誌內容格式化--> <layout class="ch.qos.logback.classic.PatternLayout"> <pattern>${LOG_MSG}</pattern> </layout> </appender> <!-- 定義 ERROR 日誌的輸出方式:--> <appender name="FILE_ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender"> <!-- 下面爲配置只輸出error級別的日誌 --> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>ERROR</level> <OnMismatch>DENY</OnMismatch> <OnMatch>ACCEPT</OnMatch> </filter> <!--日誌文件路徑,日誌文件名稱--> <File>${LOG_HOME}/err_${LOG_PREFIX}.log</File> <!-- 設置滾動策略,當天的日誌大小超過 ${MAX_FILE_SIZE} 文件大小時候,新的內容寫入新的文件, 默認10MB --> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!--日誌文件路徑,新的 ERR 日誌文件名稱,「 i 」 是個變量 --> <FileNamePattern>${LOG_DIR}/err_${LOG_PREFIX}%i.log</FileNamePattern> <!-- 配置日誌的滾動時間 ,表示只保留最近 10 天的日誌--> <MaxHistory>${MAX_HISTORY}</MaxHistory> <!--當天的日誌大小超過 ${MAX_FILE_SIZE} 文件大小時候,新的內容寫入新的文件, 默認10MB--> <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> <maxFileSize>${MAX_FILE_SIZE}</maxFileSize> </timeBasedFileNamingAndTriggeringPolicy> </rollingPolicy> <!-- 輸出的日誌內容格式化--> <layout class="ch.qos.logback.classic.PatternLayout"> <Pattern>${LOG_MSG}</Pattern> </layout> </appender> <!-- additivity 設爲false,則logger內容不附加至root ,配置以配置包下的全部類的日誌的打印,級別是 ERROR--> <logger name="org.springframework" level="ERROR" /> <logger name="org.apache.commons" level="ERROR" /> <logger name="org.apache.zookeeper" level="ERROR" /> <logger name="com.alibaba.dubbo.monitor" level="ERROR"/> <logger name="com.alibaba.dubbo.remoting" level="ERROR" /> <!-- ${LOG_ROOT_LEVEL} 日誌級別 --> <root level="${LOG_ROOT_LEVEL}"> <!-- 標識這個"${STDOUT}"將會添加到這個logger --> <appender-ref ref="${STDOUT}"/> <!-- FILE_ALL 日誌輸出添加到 logger --> <appender-ref ref="FILE_ALL"/> <!-- FILE_ERROR 日誌輸出添加到 logger --> <appender-ref ref="FILE_ERROR"/> </root> </configuration>
在代碼中使用日誌,只須要使用以下代碼:
private Logger logger = LoggerFactory.getLogger(this.getClass()); //... logger.debug("this is debug"); logger.info("this is info");
Spring Boot添加Log4j2依賴的同時,須要排除Logback依賴,配置pom.xml代碼以下:
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <exclusions><!-- 去掉logback配置 --> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-logging</artifactId> </exclusion> </exclusions> </dependency> <dependency> <!-- 引入log4j2依賴 --> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-log4j2</artifactId> </dependency> </dependencies>
添加log4j2-spring.xml文件在src/main/resources文件下,配置文件代碼以下:
<?xml version="1.0" encoding="UTF-8"?> <configuration> <Appenders> <Console name="CONSOLE" target="SYSTEM_OUT"> <PatternLayout charset="UTF-8" pattern="[%-5p] %d %c - %m%n" /> </Console> <File name="File" fileName="D:\\mylog.log"> <PatternLayout pattern="%m%n" /> </File> </Appenders> <Loggers> <root level="info"> <AppenderRef ref="CONSOLE" /> <AppenderRef ref="File" /> </root> </Loggers> </configuration>
輸入日誌到控制檯和D盤mylog.log文件中。
到此爲止,已經完成了log4j2的集成,運行項目,查看日誌。
示例源碼:https://github.com/vipstone/springboot-example/tree/master/springboot-logging
參考資料
JAVA日誌的前世此生:http://www.javashuo.com/article/p-mkyqdrpj-mm.html