對于Java來說,現(xiàn)在有很多的日志實(shí)現(xiàn),像commons-logging、log4j、log4j2、logback等,這些都是比較主流的日志實(shí)現(xiàn)。SpringBoot對上述主流的日志實(shí)現(xiàn)都做了很好的支持,這樣以來我們在使用日志框架時(shí)就顯得有些困惑了,怎么樣選擇日志框架,才是最優(yōu)配置。
其實(shí)最優(yōu)配置是相對的,不過我們可以根據(jù)SpringBoot“約定優(yōu)于配置”的理念作為指導(dǎo),來選擇適合自己的日志框架。默認(rèn)情況下,當(dāng)我們使用啟動類來構(gòu)建項(xiàng)目時(shí),SpringBoot使用logback來記錄日志。
基礎(chǔ)配置
在使用SpringBoot時(shí)收集日志時(shí),如果你對日志的顯示格式以及日志文件的輸出內(nèi)容沒有特殊的要求時(shí),我們都甚至不需要定義日志實(shí)現(xiàn)框架的配置文件,只需在SpringBoot的配置文件中添加基本日志配置即可滿足我們的需求,當(dāng)然這些配置項(xiàng)有些只是針對默認(rèn)的logback才生效,基礎(chǔ)配置項(xiàng)列表如下:
debug=false
trace=false
?# LOGGING
logging.config=
logging.exception-conversion-word=%wEx
logging.file=
logging.file.max-history=0
logging.file.max-size=10MB
logging.group.*=
logging.level.*=
logging.path=
logging.pattern.console=
logging.pattern.dateformat=yyyy-MM-dd HH:mm:ss.SSS
logging.pattern.file=
logging.pattern.level=%5
plogging.register-shutdown-hook=false
1、debug、trace屬性
默認(rèn)false,如果為true,則表示打開調(diào)試或跟蹤模式,調(diào)試或跟蹤模式只針對SpringBoot系統(tǒng)內(nèi)部日志,并不是所有的日志都以debug級別顯示,比如我們手動通過api輸出的日志就不受影響。
2、logging.config屬性
該屬性指定日志配置文件的所在位置,默認(rèn)會從classpath的根路徑加載,如果兩種方式都沒有指定,則根據(jù)日志框架實(shí)現(xiàn)類型加載默認(rèn)的日志配置文件(在框架內(nèi)部)。
3、logging.exception-conversion-word屬性
默認(rèn)值“%wEx”,主要用彩色異常日志的格式化,不常用。
4、logging.file屬性
只有在SpringBoot默認(rèn)的日志配置下此屬性才有意義,它指定日志文件生成的完整路徑或相對路徑。如果是ide運(yùn)行項(xiàng)目則相對路徑以src為基準(zhǔn),如果是可執(zhí)行jar包,則以jar包為基準(zhǔn)。
5、logging.path屬性
只有在SpringBoot默認(rèn)的日志配置下此屬性才有意義,它指定生成的日志文件所在的文件夾的完整路徑或相對路徑,相對路徑的基準(zhǔn)目錄同上。如果使用此屬性,則生成的日志文件名稱固定,為spring.log,而且如果同時(shí)配置了logging.file屬性,則以logging.file屬性配置位為準(zhǔn)。
6、logging.file.max-size屬性
此屬性只在默認(rèn)日志實(shí)現(xiàn)為logback并且loggin.file屬性啟用之后才生效,表示日志文件的大小,單位MB。如果日志文件超過此設(shè)置的之后,會自動生成一個(gè)壓縮包,壓縮包的命名規(guī)則:日志文件名稱.log.xxxx-xx-xx.num。
7、logging.file.max-history屬性
此屬性只在默認(rèn)日志實(shí)現(xiàn)為logback并且loggin.file屬性啟用之后才生效,表示生成的日志文件壓縮包的存檔時(shí)間,默認(rèn)是0,表示永遠(yuǎn)存檔,如果大于0表示最多保留x天。該屬性只在6屬性存在的情況下才有意義。
8、logging.group屬性
此屬性表示的是一個(gè)日志組,它的作用在于方便的控制某個(gè)組下的日志級別,例如:
#定義com.icypt.controller包下的日志,統(tǒng)一由controller組管理
logging.group.controller=com.icypt.controller
#控制日志組日志級別
loggin.level.contoller=info
SpringBoot也預(yù)定義了一些日志組,如下:
logging.group.web=org.springframework.core.codec, org.springframework.http, org.springframework.web, org.springframework.boot.actuate.endpoint.web, org.springframework.boot.web.servlet.ServletContextInitializerBeans
logging.group.sql=org.springframework.jdbc.core, org.hibernate.SQL
所以我們在以后調(diào)試SpringBoot項(xiàng)目時(shí)可以通過這些預(yù)定義組來臨時(shí)修改日志級別,豈不是很方便。
9、logging.level屬性
此屬性用于指定日志級別,其后可以跟root、組名稱、包名稱、包.類名等,例如:
logging.level.root=warn
logging.level.org.springframework.web=debug
logging.level.org.hibernate=error
這里有個(gè)優(yōu)先級的問題需要注意一下:logging.level后跟的路徑越詳細(xì)優(yōu)先級越高:
logging.level.包.類 > logging.level.包 > logging.level.組 > logging.level.root
10、格式化屬性
logging.pattern.console= #格式化控制臺打印的日志
logging.pattern.dateformat=yyyy-MM-dd HH:mm:ss.SSS #格式化日志日期時(shí)間
logging.pattern.file= #格式化輸出到文件的日志
logging.pattern.level=%5p #格式化日志級別
11、logging.register-shutdown-hook屬性
此屬性默認(rèn)值false,目前還未使用過此屬性,不知其使用場景是什么,各位學(xué)友有誰知道,在公眾號留言告訴我一下。
那么,如果你對日志記錄要求不是很高,采用SpringBoot默認(rèn)的logback日志框架再加上一些自定義的屬性配置就可以完成日志的搜集工作了。如果以上這些設(shè)置還不能滿足你的需求,就得自定義logback的配置文件了,當(dāng)然也可以集成其他日志框架。
自定義日志配置文件
由于SpringBoot默認(rèn)支持Logback日志實(shí)現(xiàn)框架,所以我們要做的就是定義其配置文件,并放置指定的路徑下即可,這個(gè)配置文件的存放路徑,在上述的基礎(chǔ)配置中已經(jīng)提到過,這里就不贅述了。
1、定義logback配置文件
為了使我們的配置文件結(jié)構(gòu)更加清晰,這里將logback的配置文件根據(jù)其不同的功能進(jìn)行分解整合。
配置文件一、logback入口配置文件,命名為logback-init.xml
<?xml version="1.0" encoding="UTF-8"?>
<!-- 日志級別從低到高分為TRACE < DEBUG < INFO < WARN < ERROR < FATAL,如果設(shè)置為WARN,則低于WARN的信息都不會輸出 -->
<!-- scan: 當(dāng)此屬性設(shè)置為true時(shí),配置文件如果發(fā)生改變,將會被重新加載,默認(rèn)值為true -->
<!-- scanPeriod: 設(shè)置監(jiān)測配置文件是否有修改的時(shí)間間隔,如果沒有給出時(shí)間單位,默認(rèn)單位是毫秒。當(dāng)scan為true時(shí),此屬性生效。默認(rèn)的時(shí)間間隔為1分鐘。 -->
<!-- debug: 當(dāng)此屬性設(shè)置為true時(shí),將打印出logback內(nèi)部日志信息,實(shí)時(shí)查看logback運(yùn)行狀態(tài)。默認(rèn)值為false。 -->
<configuration scan="true" scanPeriod="10 seconds">
<!-- 日志全局屬性,日志文件存放路徑 -->
<property name="log.path" value="D:/sboot/logs/" />
<!-- 日志全局屬性,日志文件前綴 -->
<property name="log.file.prefix" value="sboot" />
<!-- 日志配置模塊引入 -->
<include resource="logback/defaults.xml" />
<include resource="logback/console-appender.xml" />
<include resource="logback/file-appender.xml" />
<!-- 定義根日志級別 -->
<root level="INFO">
<!-- 引用日志追加器 -->
<appender-ref ref="CONSOLE" />
<appender-ref ref="FILE_INFO" />
<appender-ref ref="FILE_ERROR" />
</root>
</configuration>
配置文件二,logback默認(rèn)配置文件,命名為default.xml
<?xml version="1.0" encoding="UTF-8"?>
<!-- 以下均為默認(rèn)配置,基本不會動 -->
<included>
<!-- 五彩斑斕的日志轉(zhuǎn)換器 -->
<conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter" />
<conversionRule conversionWord="wex" converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter" />
<conversionRule conversionWord="wEx" converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter" />
<!-- console日志輸出格式化-->
<property name="CONSOLE_LOG_PATTERN" value="${CONSOLE_LOG_PATTERN:-%clr(%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
<!-- 文件日志輸出格式化-->
<property name="FILE_LOG_PATTERN" value="${FILE_LOG_PATTERN:-%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}} ${LOG_LEVEL_PATTERN:-%5p} ${PID:- } --- [%t] %-40.40logger{39} : %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
<!-- 自定義一些特定日志的打印級別-->
<logger name="org.apache.catalina.startup.DigesterFactory" level="ERROR"/>
<logger name="org.apache.catalina.util.LifecycleBase" level="ERROR"/>
<logger name="org.apache.coyote.http11.Http11NioProtocol" level="WARN"/>
<logger name="org.apache.sshd.common.util.SecurityUtils" level="WARN"/>
<logger name="org.apache.tomcat.util.net.NioSelectorPool" level="WARN"/>
<logger name="org.eclipse.jetty.util.component.AbstractLifeCycle" level="ERROR"/>
<logger name="org.hibernate.validator.internal.util.Version" level="WARN"/>
</included>
配置文件三、logback控制臺日志輸出配置文件,命名為console-appender.xml
<?xml version="1.0" encoding="UTF-8"?>
<!-- 輸出日志到控制臺,默認(rèn)就這樣吧 -->
<included>
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>${CONSOLE_LOG_PATTERN}</pattern>
<!-- 設(shè)置字符集 -->
<charset>UTF-8</charset>
</encoder>
</appender>
</included>
配置文件四、logback文件日志輸出配置文件,命名為file-appender.xml
<?xml version="1.0" encoding="UTF-8"?>
<included>
<!-- info日志文件appender -->
<appender name="FILE_INFO"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<encoder>
<!-- 日志文件的輸出格式 -->
<pattern>${FILE_LOG_PATTERN}</pattern>
<!-- 設(shè)置字符集 -->
<charset>UTF-8</charset>
</encoder>
<!-- 定義日志文件名稱 -->
<file>${log.path}${log.file.prefix}_info.log</file>
<!-- 此日志文件只記錄info級別的 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<!-- 被過濾的日志級別 -->
<level>ERROR</level>
<!-- 拒絕拼配到級別的日志-->
<onMatch>DENY</onMatch>
<!-- 接受沒有匹配到的日志-->
<onMismatch>ACCEPT</onMismatch>
</filter>
<!-- 文件回滾策略 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 當(dāng)當(dāng)日文件超過10MB時(shí)會進(jìn)行壓縮,壓縮的文件名稱如下 -->
<fileNamePattern>${log.path}/${log.file.prefix}_info_%d{yyyy-MM-dd}_%i.gz</fileNamePattern>
<!-- 當(dāng)日日志文件最大 -->
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>1MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<!-- 存檔-->
<maxHistory>120</maxHistory>
</rollingPolicy>
</appender>
<!-- error日志文件appender -->
<appender name="FILE_ERROR"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<encoder>
<!-- 日志文件的輸出格式 -->
<pattern>${FILE_LOG_PATTERN}</pattern>
<!-- 設(shè)置字符集 -->
<charset>UTF-8</charset>
</encoder>
<!-- 定義日志文件名稱 -->
<file>${log.path}${log.file.prefix}_error.log</file>
<!-- 此日志文件只記錄info級別的 -->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<!-- 文件回滾策略 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 當(dāng)當(dāng)日文件超過10MB時(shí)會進(jìn)行壓縮,壓縮的文件名稱如下 -->
<fileNamePattern>${log.path}/${log.file.prefix}_error_%d{yyyy-MM-dd}_%i.gz</fileNamePattern>
<!-- 當(dāng)日日志文件最大 -->
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>1MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<!-- 存檔-->
<maxHistory>120</maxHistory>
</rollingPolicy>
</appender>
</included>
以上四個(gè)配置文件由logback-init.xml文件作為統(tǒng)一入口進(jìn)行整合,使得日志配置結(jié)構(gòu)更加簡單明了,這也是對SpringBoot默認(rèn)配置的一種學(xué)習(xí)和參考。關(guān)于配置文件的說明,看注釋就好,這里就不贅述了。
2、在SpringBoot屬性配置中定義logback入口配置文件位置
#定義日志配置文件路徑
logging.config=classpath:./logback/logback-init.xml
3、溫馨提示
1>、一旦我們自定義了日志配置文件,則之前在用于logback默認(rèn)配置的基礎(chǔ)屬性都將失效,原則上自定義配置文件已經(jīng)涵蓋了之間所述的默認(rèn)配置屬性,所以并無大礙。
2>、Spring日志的初始化先與SpringBoot上下文的加載,所以不能在配置類中使用@PropertySource來獲取屬進(jìn)行日志的控制。
3>、如果想要把配置文件置于可執(zhí)行jar包的外部,只需對上述配置稍作修改即可:
修改一、SpringBoot屬性配置文件
#定義日志配置文件路徑,file的基準(zhǔn)在ide中是項(xiàng)目根目錄,在可執(zhí)行jar文件中與就是其本身
logging.config=file:./logback/logback-init.xml
或者
logging.config=完整路徑
修改二、Logback入口配置文件
<!-- 日志配置模塊引入,可以是相對路徑,也可是完整路徑,相對路徑基準(zhǔn)同上-->
<include file="./logback/defaults.xml"/>
<include file="./logback/console-appender.xml"/>
<include file="./logback/file-appender.xml"/>
至此,關(guān)于SpringBoot中Logback日志框架的使用就說清楚了,各位小伙伴趕快去實(shí)踐吧!
更多最新技術(shù)文章,請關(guān)注“冰點(diǎn)IT”公眾號