天天看點

SpringBoot項目中日志控制,配置logback(logback.xml的配置及介紹)前言一、大緻介紹仰天大笑出門去,我輩豈是蓬蒿人

SpringBoot項目中日志控制,配置logback(logback.xml的配置及介紹)

  • 前言
  • 一、大緻介紹
    • logback依賴jar包
    • logback的預設配置
    • 建立logback.xml配置檔案
  • 仰天大笑出門去,我輩豈是蓬蒿人

前言

SpringBoot項目中對日志的處理手動控制,這是我整理的logback.xml檔案内容,直接複制copy使用即可,裡面有詳細的注釋使用,如果是單子產品,就在java同層級的resoures目錄下(存放application.yml那個目錄下)建立一個logback.xml,重新開機服務即可生效。

一、大緻介紹

可直接跳過,看後面的logback.xml内容,懂的直接複制使用,一是一些理論知識,供了解的

logback依賴jar包

SpringBoot項目配置logback理論上需要添加logback-classic依賴jar包:

<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
    <version>1.2.3</version>
</dependency>
           

但是因為SpringBoot項目預設就是使用的就是logback日志系統,建立SpringBoot項目時引入的spring-boot-starter或者spring-boot-starter-web依賴jar包中已經包含了spring-boot-starter-logging的依賴,裡面同時包含多種日志系統依賴,如下圖所示:

SpringBoot項目中日志控制,配置logback(logback.xml的配置及介紹)前言一、大緻介紹仰天大笑出門去,我輩豈是蓬蒿人

包括logback和log4j,是以,

無需額外添加依賴,直接配置logback.xml就可以了

此外,如果需要切換為log4j2,那麼需要在spring-boot-starter-web依賴中排除springboot自帶的commons‐logging,然後在引入log4j2的依賴jar包

,如下所示:

<!--排除 commons‐logging-->
<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-web</artifactId>
   <exclusions>
      <exclusion>
      <groupId>commons‐logging</groupId>
      <artifactId>commons‐logging</artifactId>
      </exclusion>
   </exclusions>
</dependency>
<!--引入log4j2 -->
<dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
           

logback的預設配置

前面說到SpringBoot項目預設使用logback,那麼對于logback的配置情況,SpringBoot又是如何定義的呢?

首先,SpringBoot會從resource包下查找logback-test.xml或logback.xml ,如果這兩個都不存在,則會調用BasicConfigurator,建立一個最小化的基本配置。

最小化配置由一個關聯到根logger的ConsoleAppender組成,預設輸出模式為%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n;

root logger級别為DEBUG,是以并不會生成日志檔案,隻會輸出到控制台。

建立logback.xml配置檔案

通過自定義logback.xml配置檔案來控制日志輸出情況,通常我們會配置三個日志元件:
  • 控制台輸出
  • 輸出info級别日志檔案
  • 輸出error級别日志檔案
以下為logback.xml完整配置,裡面有具體的注釋,直接copy使用
<?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">

    <!-- 讀取application.properties配置 -->
<!--    <property resource="application.properties" />-->
    
    <!-- 生成檔案名字首 -->
    <property name="FILE_PREFIX" value="yyzRead" />
    <!-- 輸出檔案路徑 -->
    <property name="OPEN_FILE_PATH" value="D:\log_yyzDevelopRead"/>
    <!-- 檔案儲存時間 這裡是7天 -->
    <property name="EXIST_TIME" value="7"/>
    <!-- 檔案輸出格式 -->
    <property name="PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n"/>
    <!-- 日志檔案最大的大小 -->
    <property name="MAX_FILE_SIZE" value="10MB"/>


    <!--  控制台輸出  -->
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>${PATTERN}</pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>

    <!-- 輸出到all檔案 這裡是全部的日志内容 -->
    <appender name="OPEN-FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!--不能有這項配置!!!!!-->
        <!--<Encoding>UTF-8</Encoding>-->
        <!--<File>${OPEN_FILE_PATH}/${FILE_PREFIX}.log</File>-->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!--日志檔案輸出的檔案名-->
            <FileNamePattern>${OPEN_FILE_PATH}/all/${FILE_PREFIX}_%d{yyyy-MM-dd}-%i.log</FileNamePattern>
            <!--日志檔案保留天數-->
            <MaxHistory>${EXIST_TIME}</MaxHistory>
            <TimeBasedFileNamingAndTriggeringPolicy
                    class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <!--日志檔案最大的大小-->
                <MaxFileSize>${MAX_FILE_SIZE}</MaxFileSize>
            </TimeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>

        <layout class="ch.qos.logback.classic.PatternLayout">
            <pattern>${PATTERN}</pattern>
        </layout>
    </appender>

    <!--輸出到debug檔案-->
    <appender name="debug" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <FileNamePattern>${OPEN_FILE_PATH}/debug/${FILE_PREFIX}_%d{yyyy-MM-dd}-%i.log</FileNamePattern>
            <MaxHistory>30</MaxHistory>
            <TimeBasedFileNamingAndTriggeringPolicy
                    class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <MaxFileSize>${MAX_FILE_SIZE}</MaxFileSize>
            </TimeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>
        <append>true</append>
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{36} - %msg%n</pattern>
            <charset>utf-8</charset>
        </encoder>
        <!-- 隻列印DEBUG日志, -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <!-- 過濾的級别 -->
            <level>DEBUG</level>
            <!-- 比對時的操作:接收(記錄) -->
            <onMatch>ACCEPT</onMatch>
            <!-- 不比對時的操作:拒絕(不記錄) -->
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>

    <!--輸出到info檔案-->
    <appender name="info" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <FileNamePattern>${OPEN_FILE_PATH}/info/${FILE_PREFIX}_%d{yyyy-MM-dd}-%i.log</FileNamePattern>
            <MaxHistory>30</MaxHistory>
            <TimeBasedFileNamingAndTriggeringPolicy
                    class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <MaxFileSize>${MAX_FILE_SIZE}</MaxFileSize>
            </TimeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>
        <append>true</append>
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{36} - %msg%n</pattern>
            <charset>utf-8</charset>
        </encoder>
        <!-- 隻列印INFO日志 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>INFO</level>
            <!-- 比對時的操作:接收(記錄) -->
            <onMatch>ACCEPT</onMatch>
            <!-- 不比對時的操作:拒絕(不記錄) -->
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>

    <!--輸出到error檔案-->
    <appender name="error" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <FileNamePattern>${OPEN_FILE_PATH}/error/${FILE_PREFIX}_%d{yyyy-MM-dd}-%i.log</FileNamePattern>
            <MaxHistory>30</MaxHistory>
            <TimeBasedFileNamingAndTriggeringPolicy
                    class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <MaxFileSize>${MAX_FILE_SIZE}</MaxFileSize>
            </TimeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>
        <append>true</append>
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{36} - %msg%n</pattern>
            <charset>utf-8</charset>
        </encoder>
        <!-- 隻列印ERROR日志 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>ERROR</level>
            <!-- 比對時的操作:接收(記錄) -->
            <onMatch>ACCEPT</onMatch>
            <!-- 不比對時的操作:拒絕(不記錄) -->
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>

    <!--輸出到warn檔案-->
    <appender name="warn" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <FileNamePattern>${OPEN_FILE_PATH}/warn/${FILE_PREFIX}_%d{yyyy-MM-dd}-%i.log</FileNamePattern>
            <MaxHistory>30</MaxHistory>
            <TimeBasedFileNamingAndTriggeringPolicy
                    class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <MaxFileSize>${MAX_FILE_SIZE}</MaxFileSize>
            </TimeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>
        <append>true</append>
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{36} - %msg%n</pattern>
            <charset>utf-8</charset>
        </encoder>
        <!-- 隻列印WARN日志 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>WARN</level>
            <!-- 比對時的操作:接收(記錄) -->
            <onMatch>ACCEPT</onMatch>
            <!-- 不比對時的操作:拒絕(不記錄) -->
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>
    
    <!--  預設輸出info等級,然後再根據各自的攔截過濾規則去處理  -->
    <root level="info">
        <appender-ref ref="STDOUT"/>
        <appender-ref ref="OPEN-FILE"/>
        <appender-ref ref="debug" />
        <appender-ref ref="info" />
        <appender-ref ref="error" />
        <appender-ref ref="warn" />
    </root>
</configuration>
           

仰天大笑出門去,我輩豈是蓬蒿人