本文屬於原創,轉載註明出處,歡迎關注微信小程序小白AI博客
微信公衆號小白AI
或者網站 https://xiaobaiai.nethtml
[TOC]java
本篇文章主要對Spring Boot的日誌記錄進行詳細講解,包括流行的開源日誌標準接口以及流行的日誌記錄器在Spring Boot中是如何配置及應用的,以及在生產環境中,咱們所須要的配置是否都可以知足?git
相關背景知識咱們仍是須要了解的,有助於對正文內容的理解。程序員
名詞術語 | 釋義 |
---|---|
Apache Common Logging | Apache下開源項目,commons-logging的目的是爲「全部的Java日誌實現」提供一個統一的接口,使項目與日誌實現工具解耦;commons-logging和log4j都是Apache下的開源項目。commons-logging的目的是爲「全部的Java日誌實現」提供一個統一的接口,使項目與日誌實現工具解耦,它自身的日誌功能比較弱(只有一個簡單的 SimpleLog),因此通常不會單獨使用它。 |
Log4j / Log4j 2 | Apache下的開源項目,Log4j的功能很是強大,是目前最主流的java日誌工具。Log4j 2.0 引入了新的插件系統、對 properties 的支持、對基於 JSON 配置的支持和配置的自動化重載。相比以前Log4j 的1.x 版本有了很大的性能提高。它支持不少已有的日誌框架,包括 SLF4J、Commons Logging、Apache Flum、Log4j 1.x,並提供了新的程序員 API。 |
Java Util Logging | Java 的原生日誌記錄基礎組件 |
Logback | 是一個日誌框架,旨在取代Log4j,Log4j的改良版本,比Log4j擁有更多的特性,同時也帶來很大性能提高。不過性能上沒有Log4j 2好。 |
SLF4J | 跟Apache Common Logging同樣,也是一套接口,如今流行的日誌框架和接口組合就是Commons Logging加Log4j 、SLF4J加Logback、slf4j + log4j2 |
Mockito | Mockito是一個通用的模擬框架,可用於單元測試,尤爲是考慮到依賴注入而設計的類。Mockito也能夠用來測試Spring Controller,但不是針對性的支持。 |
MockMVC | MockMVC是Spring框架的配套產品,有助於測試Spring Controllers。MockMVC更加具體,與Mockito相比,通用性可能要差得多,不過對於測試Spring MVC 中Restful API是比較好的。 |
Spring Boot
使用Apache Commons Logging
接口記錄全部內部日誌記錄。Spring Boot
的默認配置對Java Util Logging
,Log4j2
和Logback
日誌記錄器的使用都提供了支持。若是你使用的是Spring Boot Starters
,默認使用的Logback
就爲日誌記錄提供很好的支持。 下面咱們分幾部分對如何作日誌記錄以及配置不一樣的日誌記錄器作說明,在Spring Boot
中只須要經過一些簡單的配置便可支持各類日誌記錄。github
默認啓動日誌記錄是由spring-boot-starter-logging
依賴項決定的,而且它是自動配置的,該自動配置可根據提供的配置啓用任何受支持的日誌記錄器(Java Util Logging,Log4J2和Logback),雖然咱們不提供任何日誌相關的配置,可是咱們仍然可以在控制檯上看到日誌打印,這是由於Spring boot
使用了Logback
提供了默認的日誌記錄支持。可是咱們上一篇文章裏爲啥沒有看到pom.xml
文件裏有導入spring-boot-starter-logging
這個依賴項呢?web
Spring Boot
的內部日誌記錄是使用Apache Commons Logging
接口編寫的,所以它是惟一的強制性依賴項。在Spring boot1.x
的時候咱們還須要手動導入,可是到了Spring boot2.x
,它是間接導入的,即咱們依賴了spring-boot-starter-web
這個依賴項時,它就依賴了spring-boot-starter-logging
,這個時候就導入了日誌記錄功能。從STS
的pom.xml文件依賴展開就能夠看到:spring
所以,Spring boot
自動配置提供使用Logback
的默認日誌記錄,而且這些配置文件中提供了默認日誌記錄的參數配置。從Spring Boot
的日誌記錄源碼就能夠看到( https://github.com/spring-pro... ) 。apache
在應用程序代碼中添加日誌記錄語句,咱們使用SLF4J
接口中的org.slf4j.Logger
和org.slf4j.LoggerFactory
。它提供了許多有用的日誌記錄方法,也使日誌記錄實現與應用程序相分離。小程序
注意:日誌接口是不少,這裏咱們選擇了SLF4J API。還有apache.logging/java.util.logging等
// 使用Log4j2則使用apache logging接口 // import org.apache.logging.log4j.LogManager; // import org.apache.logging.log4j.Logger; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class Application { private static final Logger LOGGER=LoggerFactory.getLogger(Test02HelloworldApplication.class); public static void main(String[] args) { SpringApplication.run(Application.class, args); LOGGER.info("簡單的日誌記錄測試 : {} + {} = {}", 1, 2, 3); } }
控制檯打印以下:segmentfault
2019-10-29 21:37:39.818 INFO 16244 --- [ main] c.xiaobaiai.Test02HelloworldApplication : 簡單的日誌記錄測試 : 1 + 2 = 3
Logback
支持設置ERROR
,WARN
,INFO
,DEBUG
、TRACE
或OFF
做爲日誌記錄級別,按日誌抑制優先級從高到低。默認狀況下,日誌記錄級別設置爲INFO
。這意味着DEBUG
和TRACE
消息不可見。
要啓用DEBUG
或TRACE
日誌記錄級別,咱們能夠在application.properties
文件中設置日誌記錄級別。另外,咱們也能夠在啓動應用程序時在命令行上傳遞--debug
或--trace
參數。
# In application.properties file # 方法一: 該屬性置爲true的時候,核心Logger(包含嵌入式容器、hibernate、spring)會輸出更多內容,可是你本身應用的日誌並不會輸出DEBUG級別的日誌 debug=true # 方法二:將日誌記錄級別應用於特定的軟件包。 logging.level.com.xiaobaiai=DEBUG logging.level.org.springframework=ERROR logging.level.root=DEBUG # In Console $ java -jar target/xx-app-0.0.1-SNAPSHOT.jar --trace
注意: 若是使用不一樣的日誌級別屢次定義了軟件包的日誌級別,則將使用最低級別。TRACE最低,ERROR最高。
默認的日誌記錄格式在Spring Boot
日誌記錄器Logback
源碼文件default.xml
中能夠看到:
<property name="CONSOLE_LOG_PATTERN" value="${CONSOLE_LOG_PATTERN:-%clr(%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/> <property name="FILE_LOG_PATTERN" value="${FILE_LOG_PATTERN:-%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}} ${LOG_LEVEL_PATTERN:-%5p} ${PID:- } --- [%t] %-40.40logger{39} : %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
日誌最後輸出以下信息:
---
分隔符用於區分實際日誌消息的開始要定義日誌最後的輸出格式,使用logging.pattern.console
和logging.pattern.file
屬性。
# Logging pattern for the console # 不支持JDK Logger logging.pattern.console= %d{yyyy-MM-dd HH:mm:ss} - %logger{36} - %msg%n # Logging pattern for file # 不支持JDK Logger logging.pattern.file= %d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%
默認狀況下,Spring boot
日誌僅記錄到控制檯。若是要啓用文件日誌記錄,則可使用簡單的屬性logging.file
或logging.path
輕鬆實現。
# 輸出到指定路徑,默認文件名爲spring.log logging.file.path=C:\\Work\\sts4\\test_02_helloworld\\logs # 文件名設置,使用了該項配置,則會覆蓋path設置,直接在工程當前目錄下生成日誌 logging.file.name=logfilename.log # 路徑與文件名結合(該配置項已被遺棄) logging.file=${logging.file.path}/log.log # 輸出到文件最大內容限制大小,達到最大後,會截斷 # 默認是10M,並且該設置項只對默認的Logback有效,單位GB/MB/KB等 logging.file.max-size = 10MB
若是你的終端支持ANSI,設置彩色輸出會讓日誌更具可讀性。經過在application.properties
中設置spring.output.ansi.enabled
參數來支持。
# NEVER:禁用ANSI-colored輸出(默認項) # DETECT:會檢查終端是否支持ANSI,是的話就採用彩色輸出(推薦項) # ALWAYS:老是使用ANSI-colored格式輸出,若終端不支持的時候,會有不少干擾信息,不推薦使用 spring.output.ansi.enabled=DETECT
根據不一樣的日誌系統,你能夠按以下規則組織配置文件名,就能被正確加載:
Logback
:logback-spring.xml
, logback-spring.groovy
, logback.xml
, logback.groovy
,logback-spring-xxx.xml
Log4j
:log4j-spring.properties
, log4j-spring.xml
, log4j.properties
, log4j.xml
Log4j2
:log4j2-spring.xml
, log4j2.xml
JDK (Java Util Logging)
:logging.properties
Spring Boot官方推薦優先使用帶有-spring
的文件名做爲你的日誌配置(如使用logback-spring.xml
,而不是logback.xml
),命名爲logback-spring.xml
的日誌配置文件,Spring boot能夠爲它添加一些Spring boot
特有的配置項。
上面是默認的命名規則,而且放在src/main/resources
下面便可。
若是你即想徹底掌控日誌配置,但又不想用logback.xml
做爲Logback配置的名字,能夠在application.properties
配置文件裏面經過logging.config
屬性指定自定義的名字:
logging.config=classpath:logging-config.xml
這裏簡單講述Logback
的一個自定義配置,具體的能夠參見官方文檔http://logback.qos.ch/manual/configuration.html
配置文件主要實現的功能有:
<?xml version="1.0" encoding="UTF-8"?> <!-- scan:當此屬性設置爲true時,配置文件若是發生改變,將會被從新加載,默認值爲true scanPeriod:設置監測配置文件是否有修改的時間間隔,若是沒有給出時間單位,默認單位是毫秒。 當scan爲true時,此屬性生效。默認的時間間隔爲1分鐘。 debug:當此屬性設置爲true時,將打印出logback內部日誌信息,實時查看logback運行狀態。默認值爲false。 --> <configuration scan="true" scanPeriod="60 seconds" debug="false"> <!-- 每一個logger都關聯到logger上下文,默認上下文名稱爲「default」。 但可使用contextName標籤設置成其餘名字,用於區分不一樣應用程序的記錄,如打印日誌以下中xiaobaiai 10:39:28.964 xiaobaiai [main] DEBUG c.x.Test02HelloworldApplication - 簡單的日誌記錄測試 : 1 + 2 = 3 --> <contextName>xiaobaiai</contextName> <!-- property用來定義變量值的標籤,property標籤有兩個屬性,name和value;其中name的值是變量的名稱,value的值時變量定義的值 這裏定義了log.path這個變量,下面會有引用這個變量 --> <property name="log.path" value="/Users/Ethanm/Documents/spring-log" /> <!--輸出到控制檯 --> <appender name="console" class="ch.qos.logback.core.ConsoleAppender"> <!-- 定義過濾器,ERROR級別 --> <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> <level>INFO</level> </filter> <encoder> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %contextName %magenta([%thread]) %highlight(%-5level) %logger{36}.%M - %msg%n</pattern> </encoder> </appender> <!--輸出到文件 --> <appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender"> <!-- 最新的log文件 --> <file>${log.path}/log_newest.log</file> <encoder> <!-- %d-以SimpleDateFormat容許的格式輸出日誌消息發生的時間 %thread-輸出發生日誌消息的線程的名稱。 $-5level-輸出日誌消息的日誌記錄級別。 %logger{36}-輸出發生日誌消息的包+類名。括號內的數字表示包+類名的最大長度。 %M-輸出發生日誌消息的方法的名稱(性能較差,不建議生成環境使用) %msg-輸出實際的日誌消息 %magenta()-將括號中包含的輸出的顏色設置爲洋紅色(其餘顏色可用)。 %highlight()-將括號中包含的輸出顏色設置爲取決於日誌記錄級別(例如ERROR = red) --> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %magenta([%thread]) %highlight(%-5level) %logger{36}.%M - %msg%n</pattern> </encoder> <!-- 日誌文件分割設置 --> <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"> <fileNamePattern> ${log.path}/log_%d{yyyy-MM-dd}_%i.log </fileNamePattern> <maxFileSize>3KB</maxFileSize> <!-- 只保存最近10天日誌 --> <maxHistory>10</maxHistory> <!-- 定義日誌文件上限,若是全部日誌超過這個大小,則會刪除舊的日誌 --> <totalSizeCap>100MB</totalSizeCap> </rollingPolicy> </appender> <!-- root是根logger,不能有name和additivity屬性,是有一個level --> <!-- appender是一個日誌打印的組件,這裏組件裏面定義了打印過濾的條件、打印輸出方式、滾動策略、編碼方式、打印格式等 若是咱們不使用一個logger或者root的appender-ref指定某個具體的appender時,它就不會生效 --> <root level="info"> <appender-ref ref="console" /> <appender-ref ref="file" /> </root> <!-- logger標記用來設置某一個包或者具體的某一個類的日誌打印級別以及指定appender --> <logger name="com.xiaobaiai" level="WARN" additivity="false"> <appender-ref ref="console" /> </logger> </configuration>
默認日誌記錄使用了Logback
,首先咱們須要在pom.xml
中去掉Logback
,引入Log4j2
。
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <exclusions> <!-- 用exclusion排除掉默認日誌記錄器Logback --> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-logging</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-log4j2</artifactId> </dependency>
與Logback
相似,在資源文件夾下(resources)添加以下形式的配置文件,均可以被掃描到:
配置文件設置與Logback
大同小異:
<?xml version="1.0" encoding="UTF-8"?> <Configuration status="WARN" monitorInterval="30"> <Properties> <Property name="LOG_PATTERN">%d{yyyy-MM-dd'T'HH:mm:ss.SSSZ} %p %m%n</Property> <Property name="APP_LOG_ROOT">c:/temp</Property> </Properties> <Appenders> <Console name="console" target="SYSTEM_OUT"> <PatternLayout pattern="${LOG_PATTERN}" /> </Console> <RollingFile name="file" fileName="${APP_LOG_ROOT}/SpringBoot2App/application.log" filePattern="${APP_LOG_ROOT}/SpringBoot2App/application-%d{yyyy-MM-dd}-%i.log"> <PatternLayout pattern="${LOG_PATTERN}" /> <Policies> <SizeBasedTriggeringPolicy size="19500KB" /> </Policies> <DefaultRolloverStrategy max="1" /> </RollingFile> </Appenders> <Loggers> <Root level="info"> <AppenderRef ref="console" /> <AppenderRef ref="file" /> </Root> </Loggers> </Configuration>
這裏就不展開了,到了實際使用的時候,再來詳細瞭解。
#tomcat server.tomcat.basedir=C:/temp/logs server.tomcat.accesslog.enabled=true server.tomcat.accesslog.pattern=%t %a "%r" %s (%D ms) logging.level.org.apache.tomcat=DEBUG logging.level.org.apache.catalina=DEBUG #undertow server.undertow.accesslog.directory=C:/temp/logs server.undertow.accesslog.enabled=true server.undertow.accesslog.pattern=%t %a "%r" %s (%D ms) logging.level.io.undertow.server=DEBUG logging.level.io.undertow.websockets=DEBUG #jetty server.jetty.accesslog.filename=/var/log/jetty-access.log server.jetty.accesslog.enabled=true logging.level.org.eclipse.jetty=INFO logging.level.org.eclipse.jetty.websocket=DEBUG
本篇文章讓咱們對主流的日誌接口Apache common logging
和SLF4J
有了個瞭解,Logback
是Spring boot
中默認配置的日誌記錄器,咱們對如何在application.properties
中配置日誌相關配置作了詳細說明,並對如何自定義Logback
配置也做出了詳細說明,最後介紹瞭如何切換日誌記錄器到Log4j2
以及如何配置Log4j2
給出了示例。擴展部分對內嵌WEB服務器的日誌配置也給出了個簡單的示例。總之,咱們對Spring boot
的日誌這一塊應該不會再陌生了。
本文屬於原創,轉載註明出處,歡迎關注CSDNfreeape或微信小程序小白AI博客
微信公衆號小白AI
或者網站 https://xiaobaiai.net