Spring-boot使用-logback
進行日誌記錄
前言:
Logback是log4j框架的作者開發的新一代日誌框架,它效率更高、能夠適應諸多的運行環境,同時天然支持SLF4J。
爲什麼使用logback?, logback有什麼優點:
- 內核重寫、測試充分、初始化內存加載更小,這一切讓logback性能和log4j相比有諸多倍的提升
- logback非常自然地直接實現了slf4j,這個嚴格來說算不上優點,只是這樣,再理解slf4j的前提下會很容易理解logback,也同時很容易用其他日誌框架替換logback
- logback當配置文件修改了,支持自動重新加載配置文件,掃描過程快且安全,它並不需要另外創建一個掃描線程
- 支持自動去除舊的日誌文件,可以控制已經產生日誌文件的最大數量
如果要使用LogBack,原則上是需要添加dependency依賴的
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-logging</artifactId> </dependency>
但是因爲新建的Spring Boot項目一般都會引用
spring-boot-starter
或者spring-boot-starter-web
,而這兩個起步依賴中都已經包含了對於spring-boot-starter-logging
的依賴,所以,無需額外添加依賴。Spring Boot默認的日誌級別爲INFO,這裏打印的是INFO級別的日誌所以可以顯示。
1.- 簡單使用
SpringBootLogbackApplication.java
/**
* <p>
* 啓動類
* </p>
*/
@SpringBootApplication
@Slf4j // 在需要使用到日記的地方使用>>>>Slf4j註解(前提是引入了Lombok依賴與安裝插件)
public class SpringBootLogbackApplication {
public static void main(String[] args) {
ConfigurableApplicationContext context = SpringApplication.run(SpringBootLogbackApplication.class, args);
int length = context.getBeanDefinitionNames().length;
log.trace("Spring boot啓動初始化了 {} 個 Bean", length);
log.debug("Spring boot啓動初始化了 {} 個 Bean", length);
log.info("Spring boot啓動初始化了 {} 個 Bean", length);
log.warn("Spring boot啓動初始化了 {} 個 Bean", length);
log.error("Spring boot啓動初始化了 {} 個 Bean", length);
try {
int i = 0;
int j = 1 / i;
} catch (Exception e) {
log.error("【SpringBootLogbackApplication】啓動異常:", e);
}
}
}
2.- 將日誌輸出爲文件
默認情況下,Spring Boot將日誌輸出到控制檯,不會寫到日誌文件。如果要編寫除控制檯輸出之外的日誌文件,則需在application.yml中設置logging.file或logging.path屬性。例如:
logging: path: ${spring.application.name} file: ${spring.application.name}.log
它們不會同時生效,只配置其中一個就好了!
如果只配置 logging.file,會在項目的當前路徑下生成一個 xxx.log 日誌文件。
如果只配置 logging.path,會在項目的當前路徑下生成一個文件夾裏面生成一個日誌文件爲 spring.log
3.- 級別輸出控制
可以控制日誌輸出級別,可以全局,也可以指定文件夾! 例如:
logging: level: root: debug #root使用debug級別輸出 --------------指定文件夾輸出 `↓` ----------- logging: level: com.chenzhihao: info #指定文件夾輸出
4. - 自定義日誌配置
一般情況下,我們都是需要自定義日誌配置來滿足項目的需要;
SpringBoot
官方推薦優先使用帶有-spring
的文件名作爲你的日誌配置(如使用logback-spring.xml,而不是logback.xml),命名爲logback-spring.xml
的日誌配置文件,spring boot可以爲它添加一些spring boot特有的配置項。上面是默認的命名規則,並且
resources
資源目錄下面即可。如果想自定義命名,需要在
application.yml
上加上配置:
logging.config= classpath:${spring.application.name}-config.xml
最爲普通的輸出到控制檯:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<include resource="org/springframework/boot/logging/logback/defaults.xml"/>
<!-- 定義有顏色的日記輸出格式 -->
<property name="CONSOLE_LOG_PATTERN"
value="%red(%d{yyyy-MM-dd HH:mm:ss.SSS}) %green([%thread]) %highlight(%-5level) %boldMagenta(%logger) --- %cyan(%msg%n)"/>
<!--服務名稱-->
<property name="APP_NAME" value="${spring.application.name}"/>
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>INFO</level>
</filter>
<encoder>
<pattern>${CONSOLE_LOG_PATTERN}</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<!-- 定義級別並引入自定義appender-->
<root level="info">
<appender-ref ref="CONSOLE"/>
</root>
</configuration>
如果要輸出到文件: 則添加多一個
<appender>
標籤並定義屬性, 然後在<root>
根標籤引入例如:
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true">
<include resource="org/springframework/boot/logging/logback/defaults.xml"/>
<!-- 定義有顏色的日記輸出格式 -->
.......
<!--應用名稱-->
<property name="APP_NAME" value="eureka-client"/>
<!--日誌存儲文件夾名-->
<property name="LOG_FILE_PATH" value="logss"/>
<!-- 控制檯屬性 -->
.........
<!--日誌輸出爲文件-->
<appender name="FILE_INFO" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!--如果只是想要 Info 級別的日誌,就只允許INFO 其他過濾-->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>INFO</level>
<!--匹配到就允許-->
<onMatch>ACCEPT</onMatch>
<!--沒有匹配到就禁止-->
<onMismatch>DENY</onMismatch>
</filter>
<!--滾動策略,按照時間滾動 TimeBasedRollingPolicy-->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--文件路徑,定義了日誌的切分方式——把每一天的日誌歸檔到一個文件中,以防止日誌填滿整個磁盤空間-->
<FileNamePattern>${LOG_FILE_PATH}/${APP_NAME}-info.%d{yyyy-MM-dd}.part_%i.log</FileNamePattern>
<!--只保留最近30天的日誌-->
<maxHistory>30</maxHistory>
<!--用來指定日誌文件的上限大小,那麼到了這個值,就會刪除舊的日誌-->
<totalSizeCap>1GB</totalSizeCap>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<!-- maxFileSize:這是活動文件的大小,默認值是10MB -->
<maxFileSize>2MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<!-- 輸出格式 -->
<encoder>
<pattern>%date [%thread] %-5level [%logger{100}] %file:%line - %msg%n</pattern>
<charset>UTF-8</charset> <!-- 此處設置字符集 -->
</encoder>
</appender>
<!-- 定義級別並引入自定義appender-->
<root level="info">
<appender-ref ref="CONSOLE"/>
<appender-ref ref="FILE_INFO"/> <!-- 引入輸入文件appender-->
</root>
</configuration>
5. - 當配置文件更改時,自動加載
configuration
標籤上屬性介紹
爲了讓 logback 能夠在配置文件改變的時候自動去掃描,需要在 ``configuration
標籤上添加
scan=true屬性。 例如:
`默認情況下,一分鐘掃描一次配置文件,看是否有更改。通過
configuration
標籤上的scanPeriod
屬性可以指定掃描週期。掃描週期的時間單位可以是毫秒、秒、分鐘或者小時。30 seconds
注意:如果沒有指定時間單位,則默認爲毫秒。
當設置了
scan="true"
,會新建一個ReconfigureOnChangeTask
任務用於監視配置文件是否變化。ReconfigureOnChangeTask
也會自動監視外部文件的變化。如果更改後的配置文件有語法錯誤,則會回退到之前的配置文件。
通過
configuration
標籤上的debug屬性:當此屬性設置爲true時,將打印出logback內部日誌信息,實時查看logback運行狀態。默認值爲false
6.- 標籤說明
<
configuration
>標籤屬性上面已經說了!
根標籤屬性一:contextName
設置上下文名稱
<contextName>mylogback</contextName>
每個logger都關聯到logger上下文,默認上下文名稱爲
“default”
。但可以使用設置成其他名字,用於區分不同應用程序的記錄。一旦設置,不能修改,可以通過%contextName來打印日誌上下文名稱。
根標籤屬性二:property
設置變量
<property name="log.path" value="log" />
**用來定義變量值的標籤,有兩個屬性,name和value;其中name的值是變量的名稱,value的值時變量定義的值。通過定義的值會被插入到logger上下文中。定義變量後,可以使
${}
------“${log.path}”`來使用變量。
子標籤節點一: appender
:
appender
用來格式化日誌輸出節點,有倆個屬性name和class,class用來指定哪種輸出策略,常用就是控制檯輸出策略ConsoleAppender
和文件輸出策略rolling.RollingFileAppender
。輸出控制檯與文件輸出策略看上面例子。
日誌格式:
%d{HH: mm:ss.SSS}
——日誌輸出時間。%thread
——輸出日誌的進程名字,這在Web應用以及異步任務處理中很有用。%-5level
——日誌級別,並且使用5個字符靠左對齊。%logger{36}
——日誌輸出者的名字。%msg
——日誌消息。%n
——平臺的換行符。
文件輸出策略,重要的是rollingPolicy
的定義:
TimeBasedRollingPolicy
是最常用的輪轉策略。它是基於時間來定義輪轉策略。例如按天或者按月。其他策略這裏就不介紹了。
FileNamePattern
-------${xxxxx}/logback.%d{yyyy-MM-dd}.log
定義了日誌的切分方式——把每一天的日誌歸檔到一個文件中;maxHistory
-----30
表示只保留最近30天的日誌,以防止日誌填滿整個磁盤空間。同理,可以使用%d{yyyy-MM-dd_HH-mm}
來定義精確到分的日誌切分方式;totalSizeCap
------1GB
用來指定日誌文件的上限大小,例如設置爲1GB的話,那麼到了這個值,就會刪除舊的日誌。使用這個屬性時還需要設置 maxHistory 屬性。而且,maxHistory 將會被作爲第一條件,該屬性作爲第二條件。maxFileSize
日誌文件達到了 指定的大小,會進行歸檔,遞增索引從 0 開始。- 如果沒有
File
屬性,那麼只會使用FileNamePattern
的文件路徑規則如果同時有和,那麼當天日誌是,明天會自動把今天的日誌改名爲今天的日期。即, 的日誌都是當天的。
子節點二: root
root節點是必選節點,用來指定最基礎的日誌輸出級別,只有一個level屬性,用來設置打印級別,大小寫無關:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,不能設置爲INHERITED或者同義詞NULL。
默認是DEBUG。可以包含零個或多個元素,標識這個appender將會添加到這個logger。
<root level="info">
<appender-ref ref="CONSOLE"/>
<appender-ref ref="FILE_INFO"/>
</root>
子節點三: logger
<logger>
用來設置某一個包或者具體的某一個類的日誌打印級別、以及指定。
僅有一個name屬性,一個可選的level和一個可選的addtivity屬性。
name
:用來指定受此logger約束的某一個包或者具體的某一個類。
level
:用來設置打印級別,大小寫無關:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,還有一個特俗值INHERITED或者同義詞NULL,代表強制執行上級的級別。如果未設置此屬性,那麼當前logger將會繼承上級的級別。
addtivity
:是否向上級logger傳遞打印信息。默認是true。<!-- 選擇輸出sql文件夾或者單獨一個類或者文件夾:包路徑--> <logger name="com.macro.mall.mapper" level="DEBUG"></logger>
logback
每天生成和大小生成衝突的問題可以看這個解答
個人demo配置好logback.xml
的:
拿上修修改改即可使用!
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true">
<include resource="org/springframework/boot/logging/logback/defaults.xml"/>
<!-- 定義有顏色的日記輸出格式 -->
<property name="CONSOLE_LOG_PATTERN"
value="%red(%d{yyyy-MM-dd HH:mm:ss.SSS}) %green([%thread]) %highlight(%-5level) %boldMagenta(%logger) --- %cyan(%msg%n)"/>
<!-- 定義文件日記輸出格式 -->
<property name="FILE_LOG_PATTERN"
value="%date [%thread] %-5level [%logger{100}] %file:%line - %msg%n"/>
<!--應用名稱-->
<property name="APP_NAME" value="eureka-client"/>
<!--日誌存儲文件夾名-->
<property name="LOG_FILE_PATH" value="logss"/>
<!-- 控制檯屬性 -->
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>INFO</level>
</filter>
<encoder>
<pattern>${CONSOLE_LOG_PATTERN}</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<!--日誌輸出爲文件-->
<appender name="FILE_INFO" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!--如果只是想要 Info 級別的日誌,就只允許INFO 其他過濾-->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>INFO</level>
<!--匹配到就允許-->
<onMatch>ACCEPT</onMatch>
<!--沒有匹配到就禁止-->
<onMismatch>DENY</onMismatch>
</filter>
<!--滾動策略,按照時間滾動 TimeBasedRollingPolicy-->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--文件路徑,定義了日誌的切分方式——把每一天的日誌歸檔到一個文件中,以防止日誌填滿整個磁盤空間-->
<FileNamePattern>${LOG_FILE_PATH}/${APP_NAME}-info.%d{yyyy-MM-dd}.part_%i.log</FileNamePattern>
<!--只保留最近30天的日誌-->
<maxHistory>30</maxHistory>
<!--用來指定日誌文件的上限大小,那麼到了這個值,就會刪除舊的日誌-->
<totalSizeCap>1GB</totalSizeCap>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<!-- maxFileSize:這是活動文件的大小,默認值是10MB -->
<maxFileSize>2MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<!-- 輸出格式 -->
<encoder>
<pattern>${FILE_LOG_PATTERN}</pattern>
<charset>UTF-8</charset> <!-- 此處設置字符集 -->
</encoder>
</appender>
<appender name="FILE_ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!--如果只是想要 Error 級別的日誌,就只允許Error 其他過濾-->
<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">
<FileNamePattern>${LOG_FILE_PATH}/${APP_NAME}-error.%d{yyyy-MM-dd}.part_%i.log</FileNamePattern>
<maxHistory>30</maxHistory>
<totalSizeCap>1GB</totalSizeCap>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>2MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<encoder>
<pattern>${FILE_LOG_PATTERN}</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<appender name="FILE_WARN" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!--如果只是想要 WARN 級別的日誌,就只允許WARN 其他過濾-->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>WARN</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<FileNamePattern><FileNamePattern>${LOG_FILE_PATH}/${APP_NAME}-warn.%d{yyyy-MM-dd}.part_%i.log</FileNamePattern></FileNamePattern>
<maxHistory>30</maxHistory>
<totalSizeCap>1GB</totalSizeCap>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>2MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<encoder>
<pattern>${FILE_LOG_PATTERN}</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<!-- 定義級別並引入自定義appender-->
<root level="info">
<appender-ref ref="CONSOLE"/>
<appender-ref ref="FILE_INFO"/>
<appender-ref ref="FILE_ERROR"/>
<appender-ref ref="FILE_WARN"/>
</root>
<!-- 選擇輸出sql文件夾或者單獨一個類或者文件夾:全路徑-->
<logger name="com.chenzhihao.dao" level="DEBUG"></logger>
</configuration>
日誌顏色: