Spring Boot日誌配置詳解

前言:

Spring Boot使用Commons Logging進行所有內部日誌記錄,但是將底層日誌實現保留爲打開狀態。爲Java Util Logging, Log4J2和Logback提供了默認配置 。在每種情況下,記錄器都預先配置爲使用控制檯輸出,可選的文件輸出也可用。

默認情況下,如果使用“Starter”,Logback將用於日誌記錄。還包括適當的Logback路由,以確保使用Java Util日誌記錄,Commons Logging,Log4J或SLF4J的相關庫都能正常工作。一般來說,你不需要改變你的日誌依賴性,Spring Boot的默認設置就可以正常工作。

日誌格式:

spring boot 默認輸出格式:
2017-12-08 11:50:59.838  INFO 12232 --- [           main] ationConfigEmbeddedWebApplicationContext : Refreshing org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@313ac989: startup date [Fri Dec 08 11:50:59 CST 2017]; root of context hierarchy
[           main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat initialized with port(s): 8080 (http)
[           main] o.a.c.c.StandardService                  : Starting service [Tomcat]
[           main] o.a.c.c.StandardEngine                   : Starting Servlet Engine: Apache Tomcat/8.5.16
[ost-startStop-1] o.a.c.c.C.[.[.[/]                        : Initializing Spring embedded WebApplicationContext
[ost-startStop-1] o.s.w.c.ContextLoader                    : Root WebApplicationContext: initialization completed in 1605 ms
[ost-startStop-1] o.s.b.w.s.ServletRegistrationBean        : Mapping servlet: 'dispatcherServlet' to [/]
[ost-startStop-1] o.s.b.w.s.FilterRegistrationBean         : Mapping filter: 'metricsFilter' to: [/*]
[ost-startStop-1] o.s.b.w.s.FilterRegistrationBean         : Mapping filter: 'characterEncodingFilter' to: [/*]
[ost-startStop-1] o.s.b.w.s.FilterRegistrationBean         : Mapping filter: 'hiddenHttpMethodFilter' to: [/*]
[ost-startStop-1] o.s.b.w.s.FilterRegistrationBean         : Mapping filter: 'httpPutFormContentFilter' to: [/*]
[ost-startStop-1] o.s.b.w.s.FilterRegistrationBean         : Mapping filter: 'requestContextFilter' to: [/*]
[ost-startStop-1] o.s.b.w.s.FilterRegistrationBean         : Mapping filter: 'webRequestLoggingFilter' to: [/*]
[ost-startStop-1] o.s.b.w.s.FilterRegistrationBean         : Mapping filter: 'applicationContextIdFilter' to: [/*]
[           main] s.w.s.m.m.a.RequestMappingHandlerAdapter : Looking for @ControllerAdvice: org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@313ac989: startup date [Fri Dec 08 11:50:59 CST 2017]; root of context hierarchy
[           main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/test],methods=[GET]}" onto public java.lang.String com.battle.Battle24Application.loggerLevel()

以下項目被輸出:

日期和時間 - 精確到毫秒,易於排序。
日誌級別- ,  ERROR,WARN 或。INFO、DEBUG、TRACE
進程ID。
一個—分離器來區分實際日誌消息的開始。
線程名稱 - 括在方括號中(可能會截斷控制檯輸出)。
記錄器名稱 - 這通常是源類名稱(通常縮寫)。
日誌消息。
Logback沒有一個FATAL級別(它被映射到ERROR)

接下來使用Log4j2來打印日誌

依賴如下:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter</artifactId>
    <exclusions>
        <exclusion>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-logging</artifactId>
        </exclusion>
    </exclusions>
</dependency>
<!-- log4j2  -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>

spring-boot-starterexclusions掉的spring-boot-starter-logging依賴配置如下:

<dependencies>
    <dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
</dependency>
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>jcl-over-slf4j</artifactId>
</dependency>
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>jul-to-slf4j</artifactId>
</dependency>
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>log4j-over-slf4j</artifactId>
    </dependency>
</dependencies>

從以上依賴jar所看,spring-boot默認的日誌依賴jar是logback來打印日誌。
log4j2.xml配置如下:

<?xml version="1.0" encoding="UTF-8"?>
<!--設置log4j2默認log級別爲warn-->
<configuration status="warn">
    <!-- 以下是添加日誌輸出的位置及輸出格式,格外配置日誌文件大小等等 -->
    <appenders>
        <!-- 控制檯輸出 -->
        <!--格式化輸出:%d表示日期,%thread表示線程名,%m:日誌消息,%n是換行符-->
        <console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n" />
        </console>
        <!-- RollingFile標籤 滾動日誌記錄文件  -->
        <!-- INFO日誌級別  -->
        <!-- fileName日誌文件輸出的位置,file文件名-->
        <RollingFile name="RollingFileInfo" fileName="${sys:user.home}/logs/info.log"
                     filePattern="${sys:user.home}/logs/$${date:yyyy-MM}/info-%d{yyyy-MM-dd}-%i.log">
            <Filters>
                <ThresholdFilter level="INFO"/>
                <ThresholdFilter level="WARN" onMatch="DENY" onMismatch="NEUTRAL"/>
            </Filters>
            <!-- 輸出格式 -->
            <PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
            <!-- 設置策略 -->
            <Policies>
                <!-- 基於時間的觸發策略。該策略主要是封存的log文件。兩個參數:
               interval:整型;modulate:布爾型,說明是否對封存時間進行調製 ,指定兩次封存動作之間的時間間隔。
               單位:以日誌的命名精度來確定單位,比如yyyy-MM-dd-HH 單位爲小時,
               yyyy-MM-dd-HH-mm 單位爲分鐘。 -->
                <!-- 按天分日誌文件 -->
                <TimeBasedTriggeringPolicy/>
                <!-- 按大小分日誌文件 -->
                <SizeBasedTriggeringPolicy size="100 MB"/>
            </Policies>
            <!-- 文件保留30天 -->
            <MaxHistory>30</MaxHistory>
        </RollingFile>
        <!-- 日誌級別 -->
        <RollingFile name="RollingFileWarn" fileName="${sys:user.home}/logs/warn.log"
                     filePattern="${sys:user.home}/logs/$${date:yyyy-MM}/warn-%d{yyyy-MM-dd}-%i.log">
            <Filters>
                <ThresholdFilter level="WARN"/>
                <ThresholdFilter level="ERROR" onMatch="DENY" onMismatch="NEUTRAL"/>
            </Filters>
            <PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
            <Policies>
                <TimeBasedTriggeringPolicy/>
                <SizeBasedTriggeringPolicy size="100 MB"/>
            </Policies>
        </RollingFile>
        <!-- error 日誌級別 -->
        <RollingFile name="RollingFileError" fileName="${sys:user.home}/logs/error.log"
                     filePattern="${sys:user.home}/logs/$${date:yyyy-MM}/error-%d{yyyy-MM-dd}-%i.log">
            <ThresholdFilter level="ERROR"/>
            <PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n"/>
            <Policies>
                <TimeBasedTriggeringPolicy/>
                <SizeBasedTriggeringPolicy size="100 MB"/>
            </Policies>
        </RollingFile>
    </appenders>

    <loggers>
        <!--過濾掉spring和hibernate的一些無用的debug信息-->
        <logger name="org.springframework" level="INFO"/>
        <logger name="org.hibernate" level="INFO"/>
        <logger name="com.battle" level="debug" />
        <!-- 配置記錄器級別 -->
        <root level="all">
            <appender-ref ref="Console"/>
            <appender-ref ref="RollingFileInfo"/>
            <appender-ref ref="RollingFileWarn"/>
            <appender-ref ref="RollingFileError"/>
        </root>
    </loggers>
</configuration>

xml中看和log4j 1.x類似,log4j2也有logger,appender等概念,下面幾個差別:

配置文件是log4j2.xml,而不是log4j.xml
獲取用戶HOME目錄的佔位符是“sys:user.home {user.home}”
RollingFile Appender中,有filePattern屬性,可以更好的指定“捲動”文件的文件名(另外還可以用gzip對文件進行壓縮哦)
沒有了之前的LevelRangeFilter,現在需要用兩個ThresholdFilter來實現單個log級別的過濾功能
可以通過SizeBasedTriggeringPolicy trigger來讓文件不至於過大

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