Spring_Boot使用 logback日誌(2020.3.19)

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級別的日誌所以可以顯示。

8s1AsO.png

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>

日誌顏色:

8sjxuF.png
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章