SpringBoot日誌管理

zhangzhikai1發表於2020-12-16


一、logback-spring.xml形式

  1. 配置檔案內容
<?xml version="1.0" encoding="UTF-8"?>
<!-- 日誌級別從低到高分為TRACE < DEBUG < INFO < WARN < ERROR < FATAL,如果設定為WARN,則低於WARN的資訊都不會輸出 -->
<!-- scan:當此屬性設定為true時,配置文件如果發生改變,將會被重新載入,預設值為true -->
<!-- scanPeriod:設定監測配置文件是否有修改的時間間隔,如果沒有給出時間單位,預設單位是毫秒。
                 當scan為true時,此屬性生效。預設的時間間隔為1分鐘。 -->
<!-- debug:當此屬性設定為true時,將列印出logback內部日誌資訊,實時檢視logback執行狀態。預設值為false。 -->
<configuration  scan="true" scanPeriod="10 seconds">
    <contextName>logback</contextName>
    <!--0. 日誌格式和顏色渲染 -->
    <!-- 彩色日誌依賴的渲染類 -->
    <conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter" />
    <conversionRule conversionWord="wex" converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter" />
    <conversionRule conversionWord="wEx" converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter" />

    <!-- 彩色日誌格式
            格式化輸出:%d表示日期,%thread表示執行緒名,%-5level:級別從左顯示5個字元寬度%msg:日誌訊息,%n是換行符
    -->
    <property name="CONSOLE_LOG_PATTERN" value="${CONSOLE_LOG_PATTERN:-%clr(%d{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的值是變數的名稱,
            value的值時變數定義的值。
           通過定義的值會被插入到logger上下文中。定義後,可以使“${}”來使用變數。
      -->
    <property name="log.path" value="./logs" />

    <!--1. 輸出到控制檯上,改變了springboot預設的日誌樣式    由class決定當前配置是誰的-->
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <!--此日誌appender是為開發使用,只配置最底級別,控制檯輸出的日誌級別是大於或等於此級別的日誌資訊-->
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>debug</level>
        </filter>
        <encoder>
            <Pattern>${CONSOLE_LOG_PATTERN}</Pattern>
            <!-- 設定字符集 -->
            <charset>UTF-8</charset>
        </encoder>
    </appender>

    <!--2. 輸出到文件-->
    <!-- 2.1 level為 DEBUG 日誌,時間滾動輸出  由class決定當前配置是誰的-->
    <appender name="DEBUG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 正在記錄的日誌文件的路徑及文件名 -->
        <file>${log.path}/debug/debug.log</file>
        <!--日誌文件輸出格式-->
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
            <charset>UTF-8</charset> <!-- 設定字符集 -->
        </encoder>
        <!-- 日誌記錄器的滾動策略,按日期,按大小記錄 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 日誌歸檔 -->
            <fileNamePattern>${log.path}/debug/debug-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>100MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <!--日誌文件保留天數-->
            <maxHistory>15</maxHistory>
        </rollingPolicy>
        <!-- 此日誌文件只記錄debug級別的 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>debug</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>

    <!-- 2.2 level為 INFO 日誌,時間滾動輸出  -->
    <appender name="INFO_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 正在記錄的日誌文件的路徑及文件名 -->
        <file>${log.path}/info/info.log</file>
        <!--一、如果設定了File屬性 同時也設定了下面的fileNamePattern屬性
              1.系統會將日誌內容全部寫入這個file設定的檔案中(web_error.log)2.2020-12-16凌晨,web_error.log會被重新命名為web_error.log2020-12-15.0.log。
                    (第二天凌晨會將原來的檔案按照fileNamePattern屬性設定改名)
              3.然後再生成新的web_error.log檔案,按照上面的步驟生成依次後推
            二、忽略File屬性,僅設定了下面的fileNamePattern屬性
              1.系統會將日誌內容直接寫入web_error.log2020-12-15.0.log中。
              2.2020-12-16凌晨,系統會將日誌內容直接寫入web_error.log2020-12-16.0.log中。
            總結
            仍以2020-12-15為例,如果你設定了File屬性,當天你只能看到web_error.log日誌檔案,
                2020-12-16才會看到web_error.log2020-12-15.0.log檔案。
            但是如果你忽略了,你當天就能看到web_error.log2020-12-15.0.log檔案,但你始終看不到web_error.log檔案。-->
        <!--日誌文件輸出格式-->
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
            <charset>UTF-8</charset>
        </encoder>
        <!-- 日誌記錄器的滾動策略,按日期,按大小記錄 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 每天日誌歸檔路徑以及格式 -->
            <fileNamePattern>${log.path}/info/info-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>100MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <!--日誌文件保留天數-->
            <maxHistory>15</maxHistory>
        </rollingPolicy>
        <!-- 此日誌文件只記錄info級別的 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>info</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>

    <!-- 2.3 level為 WARN 日誌,時間滾動輸出  -->
    <appender name="WARN_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 正在記錄的日誌文件的路徑及文件名 -->
        <file>${log.path}/warn/warn.log</file>
        <!--日誌文件輸出格式-->
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
            <charset>UTF-8</charset> <!-- 此處設定字符集 -->
        </encoder>
        <!-- 日誌記錄器的滾動策略,按日期,按大小記錄 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${log.path}/warn/warn-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>100MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <!--日誌文件保留天數-->
            <maxHistory>15</maxHistory>
        </rollingPolicy>
        <!-- 此日誌文件只記錄warn級別的 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>warn</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>

    <!-- 2.4 level為 ERROR 日誌,時間滾動輸出  -->
    <appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 正在記錄的日誌文件的路徑及文件名 -->
        <file>${log.path}/error/error.log</file>
        <!--日誌文件輸出格式-->
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
            <charset>UTF-8</charset> <!-- 此處設定字符集 -->
        </encoder>
        <!-- 日誌記錄器的滾動策略,按日期,按大小記錄 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!--i的值 噹噹前檔案大於100m時重新生成新的日誌檔案  i+1  i從0開始計數-->
            <fileNamePattern>${log.path}/error/error-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>100MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <!--日誌文件保留天數-->
            <maxHistory>15</maxHistory>
        </rollingPolicy>
        <!-- 此日誌文件只記錄ERROR級別的 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>ERROR</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>

    <!--
        <logger>用來設定某一個包或者具體的某一個類的日誌列印級別、以及指定<appender><logger>僅有一個name屬性,一個可選的level和一個可選的addtivity屬性。
        name:用來指定受此logger約束的某一個包或者具體的某一個類。
        level:用來設定列印級別,大小寫無關:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,
              還有一個特俗值INHERITED或者同義詞NULL,代表強制執行上級的級別。
              如果未設定此屬性,那麼當前logger將會繼承上級的級別。
        addtivity:是否向上級logger傳遞列印資訊。預設是true。

        //如下配置譯為 org.springframework.web包下所有的日誌列印info級別以上的資訊
        <logger name="org.springframework.web" level="info"/>
        <logger name="org.springframework.scheduling.annotation.ScheduledAnnotationBeanPostProcessor" level="INFO"/>
    -->

    <!--
        使用mybatis的時候,sql語句是debug下才會列印,而這裡我們只配置了info,所以想要檢視sql語句的話,有以下兩種操作:
        第一種把<root level="info">改成<root level="DEBUG">這樣就會列印sql,不過這樣日誌那邊會出現很多其他訊息
        第二種就是單獨給dao下目錄配置debug模式,程式碼如下,這樣配置sql語句會列印,其他還是正常info級別:
        【logging.level.org.mybatis=debug
          logging.level.dao=debug】
     -->

    <!--
        root節點是必選節點,用來指定最基礎的日誌輸出級別,只有一個level屬性
        level:用來設定列印級別,大小寫無關:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,
        不能設定為INHERITED或者同義詞NULL。預設是DEBUG
        可以包含零個或多個元素,標識這個appender將會新增到這個logger。
    -->

    <!-- 4. 最終的策略 -->
    <!-- 4.1 開發環境:列印控制檯-->
    <springProfile name="dev">
        <logger name="com.atguigu.springboot.controller" level="debug"/>
    </springProfile>

    <root level="info">
        <appender-ref ref="CONSOLE" />
        <appender-ref ref="DEBUG_FILE" />
        <appender-ref ref="INFO_FILE" />
        <appender-ref ref="WARN_FILE" />
        <appender-ref ref="ERROR_FILE" />
    </root>

    <!-- 4.2 生產環境:輸出到文件
    <springProfile name="pro">
        <root level="info">
            <appender-ref ref="CONSOLE" />
            <appender-ref ref="DEBUG_FILE" />
            <appender-ref ref="INFO_FILE" />
            <appender-ref ref="ERROR_FILE" />
            <appender-ref ref="WARN_FILE" />
        </root>
    </springProfile> -->

</configuration>
  1. application.yml中指定使用哪個模組的配置
#spring.profiles.active=dev
spring:
  profiles:
    active: dev
  1. 日誌檔案圖解
    日誌圖解
  2. 生成日誌檔案專案結構

在這裡插入圖片描述

  1. pom.xml
<dependencies>
       <dependency>
           <groupId>org.springframework.boot</groupId>
           <artifactId>spring-boot-starter-web</artifactId>
       </dependency>
       <dependency>
           <groupId>org.springframework.boot</groupId>
           <artifactId>spring-boot-starter-logging</artifactId>
       </dependency>
       <dependency>
           <groupId>org.springframework.boot</groupId>
           <artifactId>spring-boot-starter-test</artifactId>
           <scope>test</scope>
           <exclusions>
               <exclusion>
                   <groupId>org.junit.vintage</groupId>
                   <artifactId>junit-vintage-engine</artifactId>
               </exclusion>
           </exclusions>
       </dependency>
   </dependencies>
  1. 測試
@SpringBootTest
class SpringBoot03LoggingApplicationTests {
    //記錄器
    Logger logger = LoggerFactory.getLogger(getClass());
    @Test
    void contextLoads() {
        //級別trace<debug<info<warn<error
        logger.trace("這是trace日誌...");
        logger.debug("這是debug日誌...");
        logger.info("這是info日誌...");
        logger.warn("這是warn日誌...");
        logger.error("這是error日誌...");
    }
    執行之後就會發現各個日誌包下會列印相應的日誌資訊
    當然這裡配置的是info級別所有trace和debug的資訊不會列印出來
}

二、不使用xml

在application.properties中配置程式碼如下:

# 啟用日誌顏色
spring.output.ansi.enabled=always

##這個springboot中預設的日誌級別為info 也就是說如果不設定的話日誌只列印info和比info級別高的日誌
logging.level.root= INFO

# 單獨指定某個包下的日誌級別 debug
logging.level.com= DEBUG

#還可以設定日誌 輸出的地方
    #1.在當前專案下生成日誌檔案
logging.file.name=./logs/mylog.log
    #在本專案下生成一個名字叫spring的log檔案存放日誌
    #logging.file.name=spring.log

    #2.在本專案的磁碟根目錄下生成這個兩級資料夾並在資料夾中有一個spring.log檔案存放日誌
    #logging.file.path=/spring/boot

#日誌輸出格式:%d表示日期時間, %thread表示執行緒名,%-5level:級別從左顯示5個字元寬度
#           %logger{50} 表示logger名字最長50個字元,否則按照句點分割。%msg:日誌訊息,
#           %n是換行符   %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n
#控制檯輸出的日誌格式
logging.pattern.console=%d{yyyy/MM/dd-HH:mm:ss} [%thread] %-5level %clr(%logger){cyan} %clr(%msg%n){green}

#日誌檔案中記錄格式
logging.pattern.file=%d{yyyy/MM/dd-HH:mm} [%thread] %-5level %logger- %msg%n

#直接匯入日誌檔案會直接使用xml  加 -spring的話可以使用 profile
#設定為dev
#spring.profiles.active=dev


相關文章