1. 程式人生 > >Spring Boot從入門到精通(八)日誌管理實現和配置資訊分析

Spring Boot從入門到精通(八)日誌管理實現和配置資訊分析

Spring Boot對日誌的處理,與平時我們處理日誌的方式完全一致,它為Java Util Logging、Log4J2和Logback提供了預設配置。對於每種日誌都預先配置使用控制檯輸出和可選的檔案輸出功能。

如果使用Spring Boot Starters,那麼預設使用的日誌框架是Logback。Spring Boot底層對Java Util Logging、Commons Logging、Log4J及SLF4J日誌框架也進行了適配,只需相關配置就可以實現日誌框架的相互切換。

為了便捷,採用“Spring Boot從入門到精通(七)整合Redis實現Session共享”一章節使用的工程,【此章節來源自“Java精選”微信公眾號,切換至後臺->聚合->開源專案,分享了很多中介軟體比如Sring Boot系列文章從入門到精通等】,講述一下Spring Boot中如何實現日誌管理和相關配置資訊的分析。

自定義日誌配置

通過將相應的庫新增到classpath可以啟用各種日誌系統,然後在classpath根目錄下提供合適的配置檔案可以進一步定製日誌系統,配置檔案也可以通過Spring Environment的logging.config屬性指定。

根據不同的日誌系統,可以按如下規則組織配置檔名,就能被正確載入:

Spring Boot官方推薦優先使用帶有-spring的檔名作為定義的日誌配置(使用logback-spring.xml而不是logback.xml名稱),若命名為logback-spring.xml的日誌配置檔案,Spring Boot可以為它新增一些Spring Boot特有的配置項;建議儘可能不使用Java Util Logging方式,因為Java Util Logging從可執行jar執行時會導致一些已知的類載入問題。

Spring Envrionment轉換為System properties,一些有助於定製的配置屬性和含義,參考如下所示:

注:日誌系統在解析配置檔案時所有支援獲取系統屬性的值,具體參考spring-boot.jar中的預設配置。

Logging格式說明

Spring Boot 預設日誌輸出如下:

2020-03-13 13:48:20.836  INFO 9632 --- [           main] trationDelegate$BeanPostProcessorChecker : Bean 'bootUserMapper' of type [org.mybatis.spring.mapper.MapperFactoryBean] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2020-03-13 13:48:20.868  INFO 9632 --- [           main] trationDelegate$BeanPostProcessorChecker : Bean 'org.springframework.transaction.annotation.ProxyTransactionManagementConfiguration' of type [org.springframework.transaction.annotation.ProxyTransactionManagementConfiguration] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2020-03-13 13:48:21.173  INFO 9632 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port(s): 9090 (http)

  

上述輸出的日誌資訊,從左往右含義解釋如下:日期時間:精確到毫秒日誌級別:ERROR,WARN,INFO,DEBUG or TRACE程序:id分割符:用於區分實際的日誌記錄執行緒名:括在方括號中日誌名字:通常是源類名

日誌資訊說明

日誌資訊輸出

首先,在Maven專案中pom.xml檔案增加logging包引用,具體配置內容如下:

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-logging</artifactId>
</dependency>

  

方式一:在控制檯輸出日誌

日誌級別從低到高依次:

TRACE < DEBUG < INFO< WARN < ERROR < FATAL

Logback日誌不提供FATAL級別,它被對映到ERROR級別。
Spring Boot只會輸出比當前級別高的日誌,預設的日誌級別是INFO,因此低於INFO級別的日誌記錄都不輸出。預設級別(INFO),執行程式碼如下:

package com.yoodb.study.demo04;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
public class LoggerTest {

    private static final Logger logger = LoggerFactory.getLogger(LoggerTest.class);

    @Test
    public void test() {
        logger.trace("trace 級別的日誌");
        logger.debug("debug 級別的日誌");
        logger.info("info 級別的日誌");
        logger.warn("warn 級別的日誌");
        logger.error("error 級別的日誌");
    }
}

  

控制檯輸出結果如下:

Connected to the target VM, address: '127.0.0.1:55595', transport: 'socket'
14:05:13.957 [main] DEBUG com.yoodb.study.demo04.LoggerTest - debug 級別的日誌
14:05:13.962 [main] INFO com.yoodb.study.demo04.LoggerTest - info 級別的日誌
14:05:13.962 [main] WARN com.yoodb.study.demo04.LoggerTest - warn 級別的日誌
14:05:13.962 [main] ERROR com.yoodb.study.demo04.LoggerTest - error 級別的日誌
Disconnected from the target VM, address: '127.0.0.1:55595', transport: 'socket'

Process finished with exit code 0

  

Spring Boot中預設配置ERROR、WARN和INFO級別的日誌輸出到控制檯。您還可以通過啟動您的應用程式—debug標誌來啟用“除錯”模式(開發時推薦開啟),以下兩種方式皆可:

1)在執行命令後加入–debug標誌,例如:

$ java -jar springTest.jar --debug

2)在application.properties中配置debug=true,該屬性置為true的時候,核心Logger(包含嵌入式容器、hibernate、spring)會輸出更多內容,但是你自己應用的日誌並不會輸出為DEBUG級別。

方式二:以檔案的形式輸出日誌

預設情況下,Spring Boot將日誌輸出到控制檯,不會寫到日誌檔案。如果要編寫除控制檯輸出之外的日誌檔案,則需在application.properties中設定logging.file.name或logging.file.path屬性。

1)logging.file.name,設定檔案,可以是絕對路徑,也可以是相對路徑。例如:

logging.file.name=info.log

2)logging.file.path,設定目錄,會在該目錄下建立spring.log檔案,並寫入日誌內容,例如:

logging.file.path=/workspace/log

 

如果只配置logging.file.name,會在專案的當前路徑下生成一個xxx.log日誌檔案。如果只配置logging.file.path,在/workspace/log資料夾生成一個為spring.log日誌檔案。注:二者不能同時使用,如若同時使用,則只有logging.file.name生效。預設情況下,日誌檔案的大小達到10MB時會切分一次,產生新的日誌檔案,預設級別為:ERROR、WARN、INFO。所有支援的日誌記錄系統都可以在Spring環境中設定記錄級別,格式為:“logging.level.* = LEVEL”。

logging.level屬性:

日誌級別控制字首,*為包名或Logger名。


LEVEL引數:

選項包括TRACE、DEBUG、INFO、WARN、ERROR、FATAL、OFF。

1、雖然Spring Boot中application.properties配置檔案提供了日誌的配置,但是個人更傾向於logback.xml的配置方式。在src/main/resources目錄中增加logback-spring.xml日誌檔案,檔案內容如下(配置相對簡單,個人請根據工程情況,進行相應的配置):

<?xml version="1.0" encoding="UTF-8"?>

<configuration scan="true" scanPeriod="10 seconds">
    <appender name="INFO_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <File>${LOG_PATH}/info.log</File>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${LOG_PATH}/info-%d{yyyyMMdd}.log.%i
            </fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>500MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <maxHistory>2</maxHistory>
        </rollingPolicy>
        <layout class="ch.qos.logback.classic.PatternLayout">
            <Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} -%msg%n
            </Pattern>
        </layout>
    </appender>

    <appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>ERROR</level>
        </filter>
        <File>${LOG_PATH}/error.log</File>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${LOG_PATH}/error-%d{yyyyMMdd}.log.%i
            </fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>500MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <maxHistory>2</maxHistory>
        </rollingPolicy>
        <layout class="ch.qos.logback.classic.PatternLayout">
            <Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} -%msg%n

            </Pattern>
        </layout>
    </appender>

    <!--輸出到控制檯 ConsoleAppender-->
    <appender name="CONSOLE_APPENDER" class="ch.qos.logback.core.ConsoleAppender">
        <!--展示格式 layout-->
        <layout class="ch.qos.logback.classic.PatternLayout">
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} -%msg%n</pattern>
        </layout>
    </appender>

    <root level="INFO">
        <appender-ref ref="INFO_FILE" />
        <appender-ref ref="ERROR_FILE" />
        <appender-ref ref="CONSOLE_APPENDER" />
    </root>

</configuration>

  

注:1)控制檯和日誌檔案的字符集;2)日誌檔案的存放位置,須要遵守Linux的命名規則。根節點<configuration>包含的屬性scan:當此屬性設定為true時,配置檔案如果發生改變,將會被重新載入,預設值為true。scanPeriod:設定監測配置檔案是否有修改的時間間隔,如果沒有給出時間單位,預設單位是毫秒。當scan為true時,此屬性生效。預設的時間間隔為1分鐘。debug:當此屬性設定為true時,將打印出logback內部日誌資訊,實時檢視logback執行狀態。預設值為false。1)子節點<root>root節點是必選節點,用來指定最基礎的日誌輸出級別,只有一個level屬性。level:用來設定列印級別,大小寫無關,其值包含如下:

TRACE、DEBUG、INFO、WARN、ERROR、ALL和OFF

level不能設定為INHERITED或者同義詞NULL,預設是DEBUG。root節點中可以包含零個或多個元素,標識這個appender將會新增到這個loger。

<root level="INFO">
	<appender-ref ref="INFO_FILE" />
	<appender-ref ref="ERROR_FILE" />
	<appender-ref ref="CONSOLE_APPENDER" />
</root>

  

2)子節點<contextName>設定上下文名稱每個logger都關聯到logger上下文,預設上下文名稱為“default”。但可以使用設定成其他名字,用於區分不同應用程式的記錄。設定後不能修改,通過%contextName設定來列印日誌上下文名稱,一般來說不用這個屬性。3)子節點<appender>
appender用來格式化日誌輸出節點,有兩個屬性name和class,class用來指定哪種輸出策略,常用就是控制檯輸出策略和檔案輸出策略。控制檯輸出使用ConsoleAppender類檔案,具體參考配置如下:

<appender name="CONSOLE_APPENDER" class="ch.qos.logback.core.ConsoleAppender">
	<!--展示格式 layout-->
	<layout class="ch.qos.logback.classic.PatternLayout">
		<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} -%msg%n</pattern>
	</layout>
</appender>

  

2、在application.properties中指定logback-spring.xml檔案和日誌生成的路徑,配置內容如下:

#com.yoodb.study.demo04包下所有class以DEBUG級別輸出
logging.level.com.yoodb.study=DEBUG
#用來指定自己建立的日誌檔案
logging.config=classpath:logback-spring.xml
#指定輸出檔案位置
logging.file.path=D://workspace/log

  

3、新建HelloWorldController類檔案,具體內容如下:

package com.yoodb.study.demo04;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;  
import org.springframework.web.bind.annotation.PathVariable;  
import org.springframework.web.bind.annotation.RequestMapping;  
import org.springframework.web.bind.annotation.RestController;  
   
@RestController  
public class HelloWorldController {  
   
    protected static Logger logger=LoggerFactory.getLogger(HelloWorldController.class);  
       
    @RequestMapping("/")  
    public String helloworld(){  
        logger.debug("關注微信公眾號“Java精選”,Spring Boot系列文章持續更新中,帶你從入門到精通,玩轉Spring Boot框架。");  
        return "Hello world!";  
    }  
       
    @RequestMapping("/hello/{name}")  
    public String helloName(@PathVariable String name){  
        logger.debug("訪問 helloName,Name={}",name);  
        return "Hello "+name;  
    }  
}

  

注:在新增引用時,日誌的包一定是org.slf4j.Logger、org.slf4j.LoggerFactory類。4、啟動專案後,進行測試1)執行主程式2)在瀏覽器中依次輸入http://localhost:8080/http://localhost:8080/hello/yoodb3)由於我的工程在D盤所有log日誌檔案所在的目錄找到D:/workspace/log資料夾下,日誌檔案的名稱是在配置檔案logback-spring.xml中設定。控制檯輸出日誌:

2020-03-13 16:00:26.793 [http-nio-9090-exec-1] INFO  o.a.c.c.C.[Tomcat].[localhost].[/] -Initializing Spring DispatcherServlet 'dispatcherServlet'
2020-03-13 16:00:26.794 [http-nio-9090-exec-1] INFO  o.s.web.servlet.DispatcherServlet -Initializing Servlet 'dispatcherServlet'
2020-03-13 16:00:26.803 [http-nio-9090-exec-1] INFO  o.s.web.servlet.DispatcherServlet -Completed initialization in 9 ms
2020-03-13 16:00:26.842 [http-nio-9090-exec-1] DEBUG c.y.s.demo04.HelloWorldController -訪問 helloName,Name=yoodb
2020-03-13 16:03:10.953 [http-nio-9090-exec-4] DEBUG c.y.s.demo04.HelloWorldController -關注微信公眾號“Java精選”,Spring Boot系列文章持續更新中,帶你從入門到精通,玩轉Spring Boot框架。
日誌檔案內容如下圖所示:

本文“Spring Boot從入門到精通(八)日誌管理實現和配置資訊分析”文章的專案原始碼(springboot-study-demo04)地址:https://github.com/yoodb/springboot到此,關於Spring boot日誌管理實現和相關配置資訊的分析就講完了,下面大家不妨試一試,但要注意使用的時候配置資訊要求,有什麼疑問歡迎下方留言,小編看到後立馬回覆!

轉載:https://blog.yoodb.com/yoodb/article/detail/