Spring Boot從零入門4_日誌記錄及其配置詳解

本文屬於原創,轉載註明出處,歡迎關注微信小程序小白AI博客 微信公衆號小白AI或者網站 https://xiaobaiai.nethtml

[TOC]java

0 前言

本篇文章主要對Spring Boot的日誌記錄進行詳細講解,包括流行的開源日誌標準接口以及流行的日誌記錄器在Spring Boot中是如何配置及應用的,以及在生產環境中,咱們所須要的配置是否都可以知足?git

1 名詞術語

相關背景知識咱們仍是須要了解的,有助於對正文內容的理解。程序員

名詞術語 釋義
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是比較好的。

2 日誌記錄

Spring Boot使用Apache Commons Logging接口記錄全部內部日誌記錄。Spring Boot的默認配置對Java Util LoggingLog4j2Logback日誌記錄器的使用都提供了支持。若是你使用的是Spring Boot Starters,默認使用的Logback就爲日誌記錄提供很好的支持。 下面咱們分幾部分對如何作日誌記錄以及配置不一樣的日誌記錄器作說明,在Spring Boot中只須要經過一些簡單的配置便可支持各類日誌記錄。github

2.1 默認零配置記錄日誌

默認啓動日誌記錄是由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

2.1.1 使用日誌記錄器打印日誌

在應用程序代碼中添加日誌記錄語句,咱們使用SLF4J接口中的org.slf4j.Loggerorg.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

2.1.2 日誌記錄器的日記級別

Logback支持設置ERRORWARNINFODEBUGTRACEOFF做爲日誌記錄級別,按日誌抑制優先級從高到低。默認狀況下,日誌記錄級別設置爲INFO。這意味着DEBUGTRACE消息不可見。

要啓用DEBUGTRACE日誌記錄級別,咱們能夠在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最高。

2.1.3 日誌記錄器的日誌記錄格式

默認的日誌記錄格式在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}}"/>

日誌最後輸出以下信息:

  • 日期和時間:毫秒精度,便於排序
  • 日誌級別:ERROR, WARN, INFO, DEBUG, or TRACE
  • 進程ID
  • ---分隔符用於區分實際日誌消息的開始
  • 線程名稱:用方括號括起來(對於控制檯輸出可能會被截斷)
  • 名稱:這一般是類的名稱(一般縮寫)
  • 最後就是日誌信息體

要定義日誌最後的輸出格式,使用logging.pattern.consolelogging.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%

2.1.4 將日誌輸出到文件

默認狀況下,Spring boot日誌僅記錄到控制檯。若是要啓用文件日誌記錄,則可使用簡單的屬性logging.filelogging.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

2.1.5 日誌彩色輸出

若是你的終端支持ANSI,設置彩色輸出會讓日誌更具可讀性。經過在application.properties中設置spring.output.ansi.enabled參數來支持。

# NEVER:禁用ANSI-colored輸出(默認項)
# DETECT:會檢查終端是否支持ANSI,是的話就採用彩色輸出(推薦項)
# ALWAYS:老是使用ANSI-colored格式輸出,若終端不支持的時候,會有不少干擾信息,不推薦使用
spring.output.ansi.enabled=DETECT

2.1.6 自定義日誌配置

根據不一樣的日誌系統,你能夠按以下規則組織配置文件名,就能被正確加載:

  • Logbacklogback-spring.xml, logback-spring.groovy, logback.xml, logback.groovylogback-spring-xxx.xml
  • Log4jlog4j-spring.properties, log4j-spring.xml, log4j.properties, log4j.xml
  • Log4j2log4j2-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>

2.2 Log4j2 記錄日誌

2.2.1 引入Log4j2

默認日誌記錄使用了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>

2.2.2 添加log4j2配置文件

Logback相似,在資源文件夾下(resources)添加以下形式的配置文件,均可以被掃描到:

  • log4j2-spring.xml
  • log4j2.xml

配置文件設置與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>

2.3 內嵌WEB服務器日誌設置

這裏就不展開了,到了實際使用的時候,再來詳細瞭解。

#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

3 總結

本篇文章讓咱們對主流的日誌接口Apache common loggingSLF4J有了個瞭解,LogbackSpring boot中默認配置的日誌記錄器,咱們對如何在application.properties中配置日誌相關配置作了詳細說明,並對如何自定義Logback配置也做出了詳細說明,最後介紹瞭如何切換日誌記錄器到Log4j2以及如何配置Log4j2給出了示例。擴展部分對內嵌WEB服務器的日誌配置也給出了個簡單的示例。總之,咱們對Spring boot的日誌這一塊應該不會再陌生了。

4 參考文檔

本文屬於原創,轉載註明出處,歡迎關注CSDNfreeape或微信小程序小白AI博客 微信公衆號小白AI或者網站 https://xiaobaiai.net

相關文章
相關標籤/搜索