javascript
Spring Boot(十)Logback和Log4j2集成与日志发展史
一、簡介
Java知名的日志有很多,比如:JUL、Log4j、JCL、SLF4J、Logback、Log4j2,那么這些日志框架之間有著怎樣的關系?誕生的原因又是解決什么問題?下面一起來看。
1.1 JUL
Java有自己的日志框架JUL(Java Util Logging)在java.util.logging下,因為對開發者不友好,使用成本太高和日志級別分類不清晰的問題,所有很少有開發者用。
1.2 Log4j
因為JUL的缺陷問題,這就給了Log4j機會,所有Log4j一經推出就迅速風靡全球。
1.3 JCL
JCL是Jakarta Commons-Logging的縮寫,Jakarta在這里指的是一個組織,而不是印度的首都雅加達,Jakarta,一個早期的Apache開源項目,用于管理各個Java子項目,諸如Tomcat, Ant, Maven, Struts, JMeter, Velocity, JMeter, Commons等。2011年12月,在所有子項目都被遷移為獨立項目后,Jakarta名稱就不再使用了。
JCL誕生的初衷是因為Java自身的一些包用了JUL,而Log4j用戶使用的有很多,那么JCL就是提供一套API來實現不同Logger之間的切換。
1.4 SLF4J
SLF4J(Simple Logging Facade For Java)簡單日志門面,和JCL功能類似,但JCL有一個致命的缺點就是算法復雜,出現問題難以排除,而SLF4J的誕生就是為了解決JCL的缺點。
值得一提的是SLF4J的作者就是Log4j的作者。
1.5 Logback
Logback是Log4j的作者的另一個開源日志組件,與Log4j相比,Logback重新了內核,使它的性能提升了很多,大約是Log4j的10倍,同時占用更小的內存,并且完整的實現了SLF4J API是你可以很方便的切換日志框架。
1.6 Log4j2
Log4j2有著和Logback相同的功能,但又有自己單用的功能,比如:插件式結構、配置文件優化、異步日志等。
Log4j2是Log4j的升級,它比其前身Log4j 1.x提供了重大改進,并提供了Logback中可用的許多改進,同時修復了Logback架構中的一些固有問題。
從GitHub的更新日志來看,Logback已經有半年沒有更新了,而作為知名組織的Apache下的Log4j2的更新卻是非?;钴S的,Log4j 1.x 于2015年8月停止維護更新了。
GitHub地址
Logback:https://github.com/qos-ch/logback
log4j2:https://github.com/apache/logging-log4j2
本文分別來看Logback和Log4j2在Spring Boot中的實現。
二、Logback使用
開發環境
- JDK 8
- Spring Boot 2.0.4 RELEASE
- Maven
- Windows 10
- IDEA 2018.2
2.1 Logback的使用
Spring Boot默認集成了Logback,可以開箱即用,非常方便。因為spring-boot-starter-logging是Logback的日志實現,而Spring Boot啟動項spring-boot-starter又依賴了spring-boot-starter-logging,所以Spring Boot就默認集成了Logback,包依賴如下圖:
日志是默認控制臺輸出的,我們程序啟動的時候就使用Logback,如下圖所示:
日志組成解讀:
-
日期和時間:毫秒精度,易于排序
-
日志級別:trace、debug、info、warn、error(日志級別依次從低到高)
-
進程ID
-
---分隔符
-
線程名稱:括在方括號中(可以截斷控制臺輸出)
-
記錄器名稱:這通常是源類名(通??s寫)
-
日志具體信息
2.2 輸入文件
如果需要輸出日志到文件,只需要在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超過則分割為多個文件。
2.3 自定義日志配置
日志服務在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>2.4 代碼中使用日志
在代碼中使用日志,只需要使用如下代碼:
private Logger logger = LoggerFactory.getLogger(this.getClass()); //... logger.debug("this is debug"); logger.info("this is info");三、Log4j2集成
3.1 配置依賴組件
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>3.2 自定義日志配置
添加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日志的前世今生:https://www.cnblogs.com/xiexj/p/9417128.html
總結
以上是生活随笔為你收集整理的Spring Boot(十)Logback和Log4j2集成与日志发展史的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 万字详解Lambda、Stream和日期
- 下一篇: 你真的知道 == 和 equals 的区