SpringBoot 日志配置(logback)
作者:xcbeyond
瘋狂源自夢(mèng)想,技術(shù)成就輝煌!微信公眾號(hào):《程序猿技術(shù)大咖》號(hào)主,專注后端開(kāi)發(fā)多年,擁有豐富的研發(fā)經(jīng)驗(yàn),樂(lè)于技術(shù)輸出、分享,現(xiàn)階段從事微服務(wù)架構(gòu)項(xiàng)目的研發(fā)工作,涉及架構(gòu)設(shè)計(jì)、技術(shù)選型、業(yè)務(wù)研發(fā)等工作。對(duì)于Java、微服務(wù)、數(shù)據(jù)庫(kù)、Docker有深入了解,并有大量的調(diào)優(yōu)經(jīng)驗(yàn)。
SpringBoot支持Java Util Logging,Log4J,Log4J2和Logback日志框架,默認(rèn)采用logback日志。在實(shí)際SpringBoot項(xiàng)目中使用SpringBoot默認(rèn)日志配置是不能夠滿足實(shí)際生產(chǎn)及開(kāi)發(fā)需求的,需要選定適合的日志輸出框架,靈活調(diào)整日志輸出級(jí)別、日志輸出格式等。本章主要講述如何進(jìn)行SpringBoot項(xiàng)目的日志詳細(xì)配置。
(強(qiáng)烈建議使用Logback日志配置,因?yàn)樗萳og4j性能好多很多。)
1、添加日志依賴包
SpringBoot項(xiàng)目中依賴包spring-boot-starter中已經(jīng)包含spring-boot-starter-logging,該依賴包就是默認(rèn)的logback日志框架,則不需額外引入。
2、添加logback.xml
在/springboot/src/main/resources目錄下,新建日志配置文件logback.xml,如下:
(配置說(shuō)明見(jiàn)注釋)
<?xml version="1.0" encoding="UTF-8" ?>
<!--
scan:當(dāng)此屬性設(shè)置為true時(shí),配置文件如果發(fā)生改變,將會(huì)被重新加載,默認(rèn)值為true
scanPeriod:設(shè)置監(jiān)測(cè)配置文件是否有修改的時(shí)間間隔,如果沒(méi)有給出時(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="2 seconds">
<!--
定義滾動(dòng)記錄文件appender 作用:滾動(dòng)記錄文件,先將日志記錄到指定文件,當(dāng)符合某個(gè)條件時(shí),將日志記錄到其他文件
RollingFileAppender class="ch.qos.logback.core.rolling.RollingFileAppender"
參數(shù):
<append>:如果是true日志被追加到文件結(jié)尾,如果是false清空現(xiàn)存文件,默認(rèn)是true
<file>:被寫(xiě)入的文件名,可以是相對(duì)目錄也可以是絕對(duì)目錄,如果上級(jí)目錄不存在會(huì)自動(dòng)創(chuàng)建,沒(méi)有默認(rèn)值
<rollingPolicy>:當(dāng)發(fā)生滾動(dòng)時(shí),決定RollingFileAppender的行為,涉及文件移動(dòng)和重命名
<triggeringPolicy>:告知RollingFileAppender合適激活滾動(dòng)
<prudent>:當(dāng)為true時(shí)不支持FixedWindowRollingPolicy支持TimeBasedRollingPolicy,但是有兩個(gè)限制:1不支持也不允許文件壓縮,2不能設(shè)置file屬性必須留空
-->
<appender name="fileAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 如果是true,日志被追加到文件結(jié)尾,如果是false,清空現(xiàn)存文件.默認(rèn)是true -->
<prudent>true</prudent>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 每天滾動(dòng)一次的日志 只保留30天內(nèi)的日志文件 -->
<fileNamePattern>logs/%d{yyyy-MM-dd}/springboot_%i.log</fileNamePattern>
<maxHistory>30</maxHistory>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>10MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!-- 對(duì)日志進(jìn)行格式化 -->
<pattern>%date %level [%thread] %logger{10}.%class{0}#%method[%file:%line] %n%msg%n</pattern>
<charset>utf-8</charset>
</encoder>
</appender>
<appender name="errorAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
<prudent>true</prudent>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>logs/%d{yyyy-MM-dd}/springboot-error_%i.log</fileNamePattern>
<maxHistory>30</maxHistory>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>10MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<encoder>
<pattern>%date %level [%thread] %logger{10}.%class{0}#%method[%file:%line] %n%msg%n</pattern>
<charset>utf-8</charset>
</encoder>
<!--
配置日志級(jí)別過(guò)濾器 作用:根據(jù)日志級(jí)別進(jìn)行過(guò)濾,如果日志級(jí)別等于配置級(jí)別過(guò)濾器會(huì)根據(jù)onMath和onMismatch接收或拒絕日志
參數(shù):
<level>:設(shè)置過(guò)濾級(jí)別
<onMatch>:用于配置符合過(guò)濾條件的操作
<onMismatch>:用于配置不符合過(guò)濾條件的操作
此處配置為只接收ERROR日志級(jí)別信息
-->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- 定義控制臺(tái)appender 作用:把日志輸出到控制臺(tái) class="ch.qos.logback.core.ConsoleAppender" -->
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<layout class="ch.qos.logback.classic.PatternLayout">
<pattern>%date %level [%thread] %logger{10}.%class{0}#%method[%file:%line] %n%msg%n</pattern>
</layout>
</appender>
<!-- 將root的打印級(jí)別設(shè)置為"error",指定了名字為"console","fileAppender","errorAppender"的appender -->
<root level="error">
<appender-ref ref="console"/>
<appender-ref ref="fileAppender"/>
<appender-ref ref="errorAppender"/>
</root>
<!--
logger用來(lái)設(shè)置某一個(gè)包的日志打印級(jí)別
<loger> 僅有一個(gè)name屬性,一個(gè)可選的level和一個(gè)可選的addtivity屬性
name:用來(lái)指定受此loger約束的某一個(gè)包或者具體的某一個(gè)類
level:用來(lái)設(shè)置打印級(jí)別,大小寫(xiě)無(wú)關(guān):TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF
addtivity:是否向上級(jí)loger傳遞打印信息。默認(rèn)是true,會(huì)將信息輸入到root配置指定的地方,可以包含多個(gè)appender-ref,標(biāo)識(shí)這個(gè)appender會(huì)添加到這個(gè)logger
-->
<logger name="com.xcbeyond.springboot" level="debug"/>
</configuration>
3、日志打印。
已項(xiàng)目啟動(dòng)類中輸出debug日志為例說(shuō)明。
package com.xcbeyond.springboot;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/**
* SpringBoot啟動(dòng)類
* @author xcbeyond
* 2018年7月2日下午5:41:45
*/
@SpringBootApplication
public class SpringbootApplication {
private static Logger logger = LoggerFactory.getLogger(SpringbootApplication.class);
public static void main(String[] args) {
if(logger.isDebugEnabled()) {
logger.debug("SpringBoot starting...");
}
SpringApplication.run(SpringbootApplication.class, args);
}
}
注:請(qǐng)使用包org.slf4j.Logger、org.slf4j.LoggerFactory。SLF4J只是一個(gè)日志標(biāo)準(zhǔn),并不是日志框架的具體實(shí)現(xiàn),便于后期維護(hù)時(shí)可以根據(jù)不同的日志 框架配置不同類型的日志,而不用修改日志輸出代碼。
4、啟動(dòng)項(xiàng)目。
在項(xiàng)目的同級(jí)目錄下會(huì)生成logs\2018-07-11\日志文件夾及日志文件。