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