1.SpringBoot日誌關係:
SpringBoot使用它來做日誌功能:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring‐boot‐starter‐logging</artifactId>
</dependency>
底層依賴關係
但是呢,實際開發中我們不需要直接添加該依賴。
因爲spring-boot-starter 其中包含了 spring-boot-starter-logging ,該依賴內容就是 Spring Boot 默認的日誌框架 logback 。
SpringBoot能自動適配所有的日誌,而且底層使用slf4j+logback的方式記錄日誌,引入其他框架的時候,只需要 把這個框架依賴的日誌框架排除掉即可:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring‐boot‐starter‐web</artifactId>
<exclusions>
<exclusion>
<artifactId>spring‐boot‐starter‐logging</artifactId>
<groupId>org.springframework.boot</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring‐boot‐starter‐log4j2</artifactId>
</dependency>
2.SpringBoot日誌的使用
2.1 默認配置使用
SpringBoot默認幫我們配置好了日誌
日誌輸出格式:
%d表示日期時間,
%thread表示線程名,
%‐5level:級別從左顯示5個字符寬度
%logger{50} 表示logger名字最長50個字符,否則按照句點分割。
%msg:日誌消息,
%n是換行符
%d{yyyy‐MM‐dd HH:mm:ss.SSS} [%thread] %‐5level %logger{50} ‐ %msg%n
1)控制檯輸出:
日誌級別從高到低分爲:TRACE < DEBUG < INFO < WARN < ERROR
。
如果設置爲 INFO
,則低於 INFO
的信息都不會輸出。
Spring Boot 中默認配置 ERROR
、 WARN
和 INFO
級別的日誌輸出到控制檯。
//記錄器
Logger logger = LoggerFactory.getLogger(getClass());
@Test
public void contextLoads() {
//可以調整輸出的日誌級別;日誌就只會在這個級別以以後的高級別生效
logger.trace("這是trace日誌...");
logger.debug("這是debug日誌...");
//SpringBoot默認給我們使用的是info級別的,
logger.info("這是info日誌...");
logger.warn("這是warn日誌...");
logger.error("這是error日誌...");
}
如果每次都寫這行代碼LoggerFactory.getLogger(getClass());
會很麻煩,可以使用註解,但是需要使用 lombok
:
① 添加依賴:
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<!--可以直接用boot自帶版本-->
<version>1.8.12</version>
<optional>true</optional>
</dependency>
② 允許註解處理:Settings -> Compiler -> Annotation Processors
③ 使用:
2)文件輸出:
默認情況下,Spring Boot將日誌輸出到控制檯,不會寫到日誌文件
使用 Spring Boot 可以在 application.properties 或 .yml 配置簡單的使用
# 在控制檯輸出的日誌的格式
logging.pattern.console=%d{yyyy‐MM‐dd} [%thread] %‐5level %logger{50} ‐ %msg%n
# 指定文件中日誌輸出的格式
logging.pattern.file=%d{yyyy‐MM‐dd} === [%thread] === %‐5level === %logger{50} ==== %msg%n
logging.file 設置文件,可以是絕對路徑,也可以是相對路徑。如: logging.file=my.log
logging.path 設置目錄,會在該目錄下創建 spring.log 文件,並寫入日誌內容。 如:logging.path=/var/log
如果只配置 logging.file ,會在項目的當前路徑下生成一個 xxx.log 日誌文件。
如果只配置 logging.path ,在 /var/log 文件夾生成一個日誌文件爲 spring.log
注:二者不能同時使用,如若同時使用,則只有 logging.file
生效
3)級別控制:
在application.properties中進行配置:
格式爲: logging.level.* = LEVEL
logging.level
: 日誌級別控制前綴
*
: 包名或者Logger名
LEVEL
:選項 TRACE, DEBUG, INFO, WARN, ERROR, FATAL, OFF
2.2自定義配置
因爲SpringBoot默認日誌配置只能滿足簡單的場景,像區分日誌級別文件、每天一個日誌文件等複雜需求就無法滿足,所以可以使用日誌框架自己的配置文件。
Logging System | Customization |
---|---|
Logback | logback-spring.xml , logback-spring.groovy , logback.xml or 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 |
如果你想針對不同運行時 Profile 使用不同的日誌配置,自己配置LogBack日誌文件的名字,則可以在boot配置文件中進行指定:
logging.config=classpath\:logback-dev.xml
一般不需要這個屬性,而是直接在 logback-spring.xml
中使用 springProfile 配置,不需要 logging.config
指定不同環境使用不同配置文件。 springProfile 配置在下面介紹。
日誌配置文件詳解
① 根節點:<configuration>
包含的屬性:
- scan:當此屬性設置爲true時,配置文件如果發生改變,將會被重新加載,默認值爲true。
- scanPeriod:設置監測配置文件是否有修改的時間間隔,如果沒有給出時間單位,默認單位是毫秒當scan爲true時,此屬性生效。默認的時間間隔爲1分鐘。
- debug:當此屬性設置爲true時,將打印出logback內部日誌信息,實時查看logback運行狀態。默認值爲false。
根節點下面包含了5個子節點:
② 字節點:<contextName>
設置上下文名稱
每個logger都關聯到logger上下文,默認上下文名稱爲“default”。但可以使用設置成其他名字,用於區分不同應用程序的記錄。一旦設置,不能修改,可以通過 %contextName
來打印日誌上下文名稱,一般不用這個屬性,可有可無。
<contextName>logback</contextName>
③ 字節點:<property>
設置變量
用來定義變量值的標籤, 有兩個屬性,name和value;通過定義的值會被插入到logger上下文中。定義變量後,可以使${}
來使用變量。
<!-- 定義日誌的根目錄 -->
<property name="LOG_HOME" value="app/log" />
<!-- 定義日誌文件名稱 -->
<property name="appName" value="mhh"></property>
④ 字節點:<appender>
appender用來格式化日誌輸出節點,有倆個屬性name和class,class用來指定哪種輸出策略,常用就是控制檯輸出策略和文件輸出策略。
控制檯輸出:ConsoleAppender
示例一:使用layout
<appender name="consoleLog" class="ch.qos.logback.core.ConsoleAppender">
<layout class="ch.qos.logback.classic.PatternLayout">
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
</layout>
</appender>
示例二:使用encoder
<appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<charset>UTF-8</charset>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
</encoder>
</appender>
encoder 和 layout 在作用上沒有本質區別。但是自0.9.19版本之後,極力推薦使用encoder。
輸出到文件:FileAppender
、 RollingFileAppender
用法都一樣,這裏不詳細展開,詳細可看appender數據源
隨着應用的運行時間越來越長,日誌也會增長的越來越多,將他們輸出到同一個文件並非一個好辦法。 RollingFileAppender
用於切分文件日誌:
<!-- 滾動記錄文件,先將日誌記錄到指定文件,當符合某個條件時,將日誌記錄到其他文件 -->
<appender name="appLogAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!--日誌名稱,如果沒有File 屬性,那麼只會使用FileNamePattern的文件路徑規則如果同時有<File>和<FileNamePattern>,那麼當天日誌是<File>,明天會自動把今天的日誌改名爲今天的日期<File> 的日誌都是當天的。-->
<file>${LOG_HOME}/${appName}.log</file>
<!--如果只是想要 Info 級別的日誌,只是過濾 info 還是會輸出 Error 日誌,因爲 Error 的級別高,所以我們使用下面的策略,可以避免輸出 Error 的日誌-->
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<!--過濾 Error-->
<level>Error</level>
</filter>
<!--當發生滾動時,決定 RollingFileAppender 的行爲,涉及文件移動重命名TimeBasedRollingPolicy: 最常用的滾動策略,它根據時間來制定滾動策略,既負責滾動也負責出發滾動。 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--文件路徑,定義了日誌的切分方式——把每一天的日誌歸檔到一個文件中,以防止日誌填滿整個磁盤空間-->
<fileNamePattern>${LOG_HOME}/${appName}-%d{yyyy-MM-dd}-%i.log</fileNamePattern>
<!-- 可選節點,控制保留的歸檔文件的最大數量,超出數量就刪除舊文件。假設設置每天滾動,且maxHistory是365,則只保存最近365天的文件,刪除之前的舊文件。注意,刪除舊文件是,那些爲了歸檔而創建的目錄也會被刪除。 -->
<MaxHistory>365</MaxHistory>
<!--用來指定日誌文件的上限大小,那麼到了這個值,就會刪除舊的日誌-->
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>100MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<!-- 日誌輸出格式: -->
<layout class="ch.qos.logback.classic.PatternLayout">
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [ %thread ] - [ %-5level ] [ %logger{50} : %line ] - %msg%n</pattern>
</layout>
</appender>
⑤ 子節點:<root>
root節點是必選節點,用來指定最基礎的日誌輸出級別,只有一個level屬性。
默認是DEBUG。
可以包含零個或多個元素,標識這個appender將會添加到這個loger。
<root level="debug">
<appender-ref ref="stdout" />
<appender-ref ref="appLogAppender" />
</root>
⑥ 子節點:<logger>
<loger>
用來設置某一個包或者具體的某一個類的日誌打印級別、以及指定 <appender>
。
常用屬性:
name
:用來指定受此loger約束的某一個包或者具體的某一個類。
level
:要記錄的日誌級別,包括 TRACE < DEBUG < INFO < WARN < ERROR
additivity
:作用在於children-logger是否使用 rootLogger配置的appender進行輸出。即是否向上級loger傳遞打印信息。默認是true。
false:表示只用當前logger的appender-ref,
true:表示當前logger的appender-ref和rootLogger的appender-ref都有效
多環境日誌輸出
<configuration>
...
<!-- 測試環境+開發環境. 多個使用逗號隔開. -->
<springProfile name="test,dev">
<logger name="com.example.demo.controller" level="DEBUG" additivity="false">
<appender-ref ref="consoleLog"/>
</logger>
</springProfile>
<!-- 生產環境. -->
<springProfile name="prod">
<logger name="com.example.demo.controller" level="INFO" additivity="false">
<appender-ref ref="consoleLog"/>
</logger>
</springProfile>
</configuration>
這裏給上一個真實項目的日誌配置文件,以便於對應理解 下載地址