Spring Boot對日誌的處理,與平時咱們處理日誌的方式徹底一致,它爲Java Util Logging、Log4J2和Logback提供了默認配置。對於每種日誌都預先配置使用控制檯輸出和可選的文件輸出功能。java
若是使用Spring Boot Starters,那麼默認使用的日誌框架是Logback。Spring Boot底層對Java Util Logging、Commons Logging、Log4J及SLF4J日誌框架也進行了適配,只需相關配置就能夠實現日誌框架的相互切換。git
爲了便捷,採用「Spring Boot從入門到精通(七)集成Redis實現Session共享」一章節使用的工程,【此章節來源自「Java精選」微信公衆號,切換至後臺->聚合->開源項目,分享了不少中間件好比Sring Boot系列文章從入門到精通等】,講述一下Spring Boot中如何實現日誌管理和相關配置信息的分析。github
自定義日誌配置web
經過將相應的庫添加到classpath能夠激活各類日誌系統,而後在classpath根目錄下提供合適的配置文件能夠進一步定製日誌系統,配置文件也能夠經過Spring Environment的logging.config屬性指定。spring
根據不一樣的日誌系統,能夠按以下規則組織配置文件名,就能被正確加載:瀏覽器
Spring Boot官方推薦優先使用帶有-spring的文件名做爲定義的日誌配置(使用logback-spring.xml而不是logback.xml名稱),若命名爲logback-spring.xml的日誌配置文件,Spring Boot能夠爲它添加一些Spring Boot特有的配置項;建議儘量不使用Java Util Logging方式,由於Java Util Logging從可執行jar運行時會致使一些已知的類加載問題。tomcat
Spring Envrionment轉換爲System properties,一些有助於定製的配置屬性和含義,參考以下所示:springboot
注:日誌系統在解析配置文件時全部支持獲取系統屬性的值,具體參考spring-boot.jar中的默認配置。微信
Logging格式說明mybatis
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。
一、雖然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>
二、在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
三、新建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類。四、啓動項目後,進行測試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日誌管理實現和相關配置信息的分析就講完了,下面你們不妨試一試,但要注意使用的時候配置信息要求,有什麼疑問歡迎下方留言,小編看到後立馬回覆!