天天看點

Spring Boot 進階-如何自定義SpringBoot日志配置?

作者:架構師面試寶典
Spring Boot 進階-如何自定義SpringBoot日志配置?

在之前的文章中我們介紹了Spring Boot中的日志架構,并且也介紹了SpringBoot日志架構中日志級别的調整。這篇文章我們主要來介紹關于如何讓日志架構更加符合我們自己的需求。那麼首先我們就來看一下日志檔案輸出路徑的配置。

如何指定日志檔案的輸出位置

在Spring Boot中日志是預設别輸出到控制台的,但是這樣的做法在測試生産環境顯然是不可取的,是以我們就需要将日志輸出到指定的路徑中的指定檔案中,這樣既友善了我們查找問題,也友善我們利用日志來進行大資料分析等操作。

在Spring Boot 日志子產品配置中有兩個配置非常重要,如下所示。

logging:
  level:
    com.example.demo: debug
  file:
    path: ./log
    name: test.log           

其中我們指定了日志生效的級别,以及日志的路徑和日志檔案名。下面我們來測試一下。會看到運作項目之後,會在目前路徑下建立一個test.log的檔案,其中内容就是在控制台輸出的日志内容。

Spring Boot 進階-如何自定義SpringBoot日志配置?

這裡需要注意點,就是在官方文檔中表述,path和name兩個屬性不能同時配置,否則隻能生效一個或者是不生效。這裡需要注意。例如上面的配置中我們看到對于path的配置實際上是沒有生效的。

當然在日志檔案的相關配置中還有其他的一些屬性配置,例如日志大小、日志保留天數等等,這個在下面我們會介紹到。

如何定制日志格式呢?

在之前的文章中我們介紹了關于日志預設格式都有哪些内容,那麼我們如何利用Spring Boot預設的日志配置來自定義自己的日志輸出格式呢?

這裡有兩個配置需要進行修改

logging:
  level:
    com.example.demo: debug
  file:
    path: H:\demo\log
    name: test.log
  pattern:
    console: '%d{yyyy-MM-dd --- HH:mm:ss} [%thread] %-5level %logger -%msg%n'
    file: '%d{yyyy-MM-dd} [%thread] %-5level %logger -%msg%n'           

其中console是用來配置控制台日志的輸出,而file是用來控制日志檔案中日志格式,這裡需要注意一點,就是再基于YML檔案配置的時候,由于YML配置檔案不支援SPEL表達式,是以需要将其用單引号引起來。

Spring Boot 進階-如何自定義SpringBoot日志配置?

日志檔案中的日志格式

Spring Boot 進階-如何自定義SpringBoot日志配置?

控制台的日志格式

如圖所示,整個的日志格式都發生了變化。進行了對應的調整顯示。這裡我們來說明一下日志配置中各種配置項的含義

  • %d{HH:mm:ss SSS} 辨別日志輸出的時間
  • %thread 辨別輸出日志程序号,整個在異步多線程中會很有用
  • %-5level 辨別日志級别,使用5個字元并且左對齊
  • %logger 輸出日志的名稱
  • %msg--日志消息内容
  • %n--日志換行符

使用不同的日志架構來實作自定義日志配置?

在Spring Boot的官方文檔中,對于不同的日志系統,指定了不同的日志配置檔案的格式,隻需要按照對應的日志配置檔案進行配置,那麼一定就可以被SpringBoot架構加載内容。

  • LogBack :支援 logback-spring.xml,logback-spring.groovy,logback.xml,logback.groovy。這裡需要說明一下的是groovy有點類似于JVM,有興趣的讀者可以了解一下。
  • Log4j:支援log4j-spring.propreties,log4j-spring.xml,log4j.properties ,log4j.xml
  • Log4j2:支援log4j2-spring.xml,log4j2.xml
  • JDK :支援logging.properties

在Spring Boot官方中推薦使用的是含有spring的檔案名的配置。是以隻需要在src/resource檔案夾下建立logback-spring.xml檔案就可以進行自定的配置了。注意,下面的配置隻是用來示範,不推薦直接使用

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <!-- 日志存放路徑 -->
    <property name="log.path" value="/home/ruoyi/logs" />
    <!-- 日志輸出格式 -->
    <property name="log.pattern" value="%d{HH:mm:ss.SSS} [%thread] %-5level %logger{20} - [%method,%line] - %msg%n" />

    <!-- 控制台輸出 -->
    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>${log.pattern}</pattern>
        </encoder>
    </appender>

    <!-- 系統日志輸出 -->
    <appender name="file_info" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${log.path}/sys-info.log</file>
        <!-- 循環政策:基于時間建立日志檔案 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 日志檔案名格式 -->
            <fileNamePattern>${log.path}/sys-info.%d{yyyy-MM-dd}.log</fileNamePattern>
            <!-- 日志最大的曆史 60天 -->
            <maxHistory>60</maxHistory>
        </rollingPolicy>
        <encoder>
            <pattern>${log.pattern}</pattern>
        </encoder>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <!-- 過濾的級别 -->
            <level>INFO</level>
            <!-- 比對時的操作:接收(記錄) -->
            <onMatch>ACCEPT</onMatch>
            <!-- 不比對時的操作:拒絕(不記錄) -->
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>

    <appender name="file_error" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${log.path}/sys-error.log</file>
        <!-- 循環政策:基于時間建立日志檔案 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 日志檔案名格式 -->
            <fileNamePattern>${log.path}/sys-error.%d{yyyy-MM-dd}.log</fileNamePattern>
            <!-- 日志最大的曆史 60天 -->
            <maxHistory>60</maxHistory>
        </rollingPolicy>
        <encoder>
            <pattern>${log.pattern}</pattern>
        </encoder>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <!-- 過濾的級别 -->
            <level>ERROR</level>
            <!-- 比對時的操作:接收(記錄) -->
            <onMatch>ACCEPT</onMatch>
            <!-- 不比對時的操作:拒絕(不記錄) -->
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>

    <!-- 使用者通路日志輸出  -->
    <appender name="sys-user" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${log.path}/sys-user.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 按天復原 daily -->
            <fileNamePattern>${log.path}/sys-user.%d{yyyy-MM-dd}.log</fileNamePattern>
            <!-- 日志最大的曆史 60天 -->
            <maxHistory>60</maxHistory>
        </rollingPolicy>
        <encoder>
            <pattern>${log.pattern}</pattern>
        </encoder>
    </appender>

    <!-- 系統子產品日志級别控制  -->
    <logger name="com.ruoyi" level="info" />
    <!-- Spring日志級别控制  -->
    <logger name="org.springframework" level="warn" />

    <root level="info">
        <appender-ref ref="console" />
    </root>

    <!--系統記錄檔-->
    <root level="info">
        <appender-ref ref="file_info" />
        <appender-ref ref="file_error" />
    </root>

    <!--系統使用者記錄檔-->
    <logger name="sys-user" level="info">
        <appender-ref ref="sys-user"/>
    </logger>
</configuration>            

總結

這篇文章中,我們介紹了如何實作自定義的一些日志配置,并且介紹了如何使用其他的日志架構來修改日志配置内容。在後續的介紹中我們将介紹到關于xml檔案如何進行日志自定義的配置。

繼續閱讀