- 依賴(lài)
<!-- springboot 的springboot-core已經(jīng)依賴(lài)了logback-core和logback-classic -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.25</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>log4j-over-slf4j</artifactId>
<version>1.7.25</version>
</dependency>
Spring Boot應(yīng)用將自動(dòng)使用logback作為應(yīng)用日志框架颤陶,Spring Boot啟動(dòng)的時(shí)候颗管,由org.springframework.boot.logging.Logging-Application-Listener根據(jù)情況初始化并使用。
日志級(jí)別
從低到高分為T(mén)RACE < DEBUG < INFO < WARN < ERROR < FATAL滓走,如果設(shè)置為WARN垦江,則低于WARN的信息都不會(huì)輸出。-
自定義日志配置
由于日志服務(wù)一般都在ApplicationContext創(chuàng)建前就初始化了搅方,它并不是必須通過(guò)Spring的配置文件控制疫粥。因此通過(guò)系統(tǒng)屬性和傳統(tǒng)的Spring Boot外部配置文件依然可以很好的支持日志控制和管理。
根據(jù)不同的日志系統(tǒng)腰懂,你可以按如下規(guī)則組織配置文件名梗逮,就能被正確加載:日志框架 配置文件名 Logback logback-spring.xml, logback-spring.groovy, logback.xml, logback.groovy Log4j log4j-spring.properties, log4j-spring.xml, log4j.properties, log4j.xml Log4j2 log4j2-spring.xml, log4j2.xml JDK (Java Util Logging) logging.properties Spring Boot官方推薦優(yōu)先使用帶有-spring的文件名作為你的日志配置(如使用logback-spring.xml,而不是logback.xml)绣溜,命名為logback-spring.xml的日志配置文件慷彤,spring boot可以為它添加一些spring boot特有的配置項(xiàng)(下面會(huì)提到)。
上面是默認(rèn)的命名規(guī)則怖喻,并且放在src/main/resources下面即可底哗。如果你即想完全掌控日志配置,但又不想用logback.xml作為L(zhǎng)ogback配置的名字锚沸,可以在application.properties配置文件里面通過(guò)logging.config屬性指定自定義的名字:logging.config=classpath:logback.xml
logback.xml 示例
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE xml>
<configuration scan="true" scanPeriod="60 seconds" debug="false">
<contextName>logback</contextName>
<property name="log.path" value="log" />
<!--輸出到控制臺(tái)-->
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<!-- <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>ERROR</level>
</filter>-->
<encoder>
<pattern>%d{HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<!--輸出到文件-->
<appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${log.path}/logback.%d{yyyy-MM-dd}.log</fileNamePattern>
</rollingPolicy>
<encoder>
<pattern>%d{HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<root level="info">
<appender-ref ref="console" />
<appender-ref ref="file" />
</root>
<!-- logback為java中的包 -->
<logger name="com.mico.emptyspringboot.controller"/>
<!--logback.LogbackDemo:類(lèi)的全路徑 -->
<logger name="com.mico.emptyspringboot.controller.UserController" level="WARN" additivity="false">
<appender-ref ref="console"/>
</logger>
</configuration>
-
根節(jié)點(diǎn)
<configuration>
包含的屬性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焰望。
-
根節(jié)點(diǎn)
<configuration>
的子節(jié)點(diǎn):<configuration>
下面一共有2個(gè)屬性,3個(gè)子節(jié)點(diǎn)已亥,分別是:-
設(shè)置上下文名稱(chēng)
<contextName>
每個(gè)logger都關(guān)聯(lián)到logger上下文柿估,默認(rèn)上下文名稱(chēng)為“default”。但可以使用設(shè)置成其他名字陷猫,用于區(qū)分不同應(yīng)用程序的記錄秫舌。一旦設(shè)置,不能修改,可以通過(guò)%contextName來(lái)打印日志上下文名稱(chēng)绣檬。
<contextName>logback</contextName>
設(shè)置變量
<property>
用來(lái)定義變量值的標(biāo)簽足陨,有兩個(gè)屬性,name和value娇未;其中name的值是變量的名稱(chēng)墨缘,value的值時(shí)變量定義的值。通過(guò)定義的值會(huì)被插入到logger上下文中零抬。定義變量后镊讼,可以使“${}”來(lái)使用變量。<property name="log.path" value="log" />
-
子節(jié)點(diǎn)
<appender>
appender用來(lái)格式化日志輸出節(jié)點(diǎn)平夜,有倆個(gè)屬性name和class蝶棋,class用來(lái)指定哪種輸出策略,常用就是控制臺(tái)輸出策略和文件輸出策略忽妒。
控制臺(tái)輸出ConsoleAppender:<!--輸出到控制臺(tái)--> <appender name="console" class="ch.qos.logback.core.ConsoleAppender"> <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> <level>ERROR</level> </filter> <encoder> <pattern>%d{HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{36} - %msg%n</pattern> </encoder> </appender>
-
<encoder>
表示對(duì)日志進(jìn)行編碼:-
%d{HH: mm:ss.SSS}
——日志輸出時(shí)間玩裙。 -
%thread
——輸出日志的進(jìn)程名字,這在Web應(yīng)用以及異步任務(wù)處理中很有用段直。 -
%-5level
——日志級(jí)別吃溅,并且使用5個(gè)字符靠左對(duì)齊。 -
%logger{36}
——日志輸出者的名字鸯檬。 -
%msg
——日志消息决侈。 -
%n
——平臺(tái)的換行符。
-
ThresholdFilter為系統(tǒng)定義的攔截器喧务,例如我們用ThresholdFilter來(lái)過(guò)濾掉ERROR級(jí)別以下的日志不輸出到文件中赖歌。如果不用記得注釋掉枉圃,不然你控制臺(tái)會(huì)發(fā)現(xiàn)沒(méi)日志
- 輸出到文件RollingFileAppender:
另一種常見(jiàn)的日志輸出到文件,隨著應(yīng)用的運(yùn)行時(shí)間越來(lái)越長(zhǎng)俏站,日志也會(huì)增長(zhǎng)的越來(lái)越多,將他們輸出到同一個(gè)文件并非一個(gè)好辦法痊土。RollingFileAppender用于切分文件日志:
<!--輸出到文件--> <appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender"> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>${log.path}/logback.%d{yyyy-MM-dd}.log</fileNamePattern> <maxHistory>30</maxHistory> <totalSizeCap>1GB</totalSizeCap> </rollingPolicy> <encoder> <pattern>%d{HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{36} - %msg%n</pattern> </encoder> </appender>
-
其中重要的是rollingPolicy的定義:
<fileNamePattern>${log.path}/logback.%d{yyyy-MM-dd}.log</fileNamePattern>
定義了日志的切分方式——把每一天的日志歸檔到一個(gè)文件中肄扎;<maxHistory>30</maxHistory>
表示只保留最近30天的日志,以防止日志填滿整個(gè)磁盤(pán)空間赁酝。同理犯祠,可以使用%d{yyyy-MM-dd_HH-mm}
來(lái)定義精確到分的日志切分方式;<totalSizeCap>1GB</totalSizeCap>
用來(lái)指定日志文件的上限大小酌呆,例如設(shè)置為1GB的話衡载,那么到了這個(gè)值,就會(huì)刪除舊的日志隙袁。logback 每天生成和大小生成沖突的問(wèn)題可以看這個(gè)解答痰娱。
-
子節(jié)點(diǎn)
<root>
root節(jié)點(diǎn)是必選節(jié)點(diǎn),用來(lái)指定最基礎(chǔ)的日志輸出級(jí)別菩收,只有一個(gè)level屬性梨睁,用來(lái)設(shè)置打印級(jí)別,大小寫(xiě)無(wú)關(guān):TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF娜饵,不能設(shè)置為INHERITED或者同義詞NULL坡贺。默認(rèn)是DEBUG∠湮瑁可以包含零個(gè)或多個(gè)元素遍坟,標(biāo)識(shí)這個(gè)appender將會(huì)添加到這個(gè)logger。
<root level="debug"> <appender-ref ref="console" /> <appender-ref ref="file" /> </root>
-
子節(jié)點(diǎn)
<logger>
<logger>
用來(lái)設(shè)置某一個(gè)包或者具體的某一個(gè)類(lèi)的日志打印級(jí)別晴股、以及指定<appender>
愿伴。<logger>
僅有一個(gè)name屬性,一個(gè)可選的level和一個(gè)可選的addtivity屬性电湘。name
:用來(lái)指定受此logger約束的某一個(gè)包或者具體的某一個(gè)類(lèi)公般。level
:用來(lái)設(shè)置打印級(jí)別,大小寫(xiě)無(wú)關(guān):TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF胡桨,還有一個(gè)特俗值INHERITED或者同義詞NULL官帘,代表強(qiáng)制執(zhí)行上級(jí)的級(jí)別。如果未設(shè)置此屬性昧谊,那么當(dāng)前l(fā)ogger將會(huì)繼承上級(jí)的級(jí)別刽虹。addtivity
:是否向上級(jí)logger傳遞打印信息呢诬。默認(rèn)是true涌哲。
-