springboot之日誌配置-logback

springboot之日誌配置-logback

1、爲什麼使用logback

  • logback是springboot默認集成的,是基於Sl4J的日誌框架。
  • logback的內核重寫了,使得在某些關鍵路徑上執行時大約會節省大約10倍的速度,同時佔用更少的內存。
  • logback提供了更加詳細並且不斷更新的文檔。
  • logback支持自動從I / O故障中恢復正常。如果文件服務器暫時失敗,可以不用重新啓動應用程序讓日誌記錄再次運行,一旦文件服務器恢復,相關的logback appender將從之前的錯誤狀態自動的快速恢復。

2、logback在springboot項目中的簡單使用

logback是springboot項目中的默認集成的日誌框架,在默認的配置環境下,該日誌框架只會輸出INFO級別以上的日誌信息到控制檯中,如果需要將日誌文件輸出到具體的文件中,可以在application.properties或者application.yml文件中添加日誌文件的輸出路徑和名稱。

//設置日誌文件,可以是絕對路徑,也可以是相對路徑
logging.file=xxx.log
//設置日誌文件保存目錄,會在該目錄下創建spring.log文件,並寫入日誌內容
logging.path=/logs
//注:二者不能同時使用,若同時使用,則只有logging.file生效

3、自定義logback的配置文件,適應項目中對日誌的不同需求

在springboot項目中,項目會自動掃描類路徑(即classpath:)下的logback.xml和logback-spring.xml(spring官方推薦的配置文件名稱)文件,如果沒有找到,則使用spring默認的logback的配置文件。
所以,在自定義logback的配置時,優先在logback.xml和logback-spring.xml文件中書寫。如果是其他格式,也一定要以logback-爲文件前綴,最後在application.properties中使用logging.config=來指定日誌配置文件位置。

logging.config=classpath:logging-xxx.xml

4、書寫配置文件前需要清楚的幾個知識點

  • 根節點:文件中的所有內容都將包含在此根節點中,該節點包含下面三個屬性
    • scan:默認值爲true,當此屬性值設置爲true時,配置文件如果發生改變,將會被重新加載
    • scanPeriod:設置監測配置文件是否有修改的時間間隔,如果沒有給出時間單位,默認的時間單位是毫秒。當scan爲true時,此屬性生效。默認的間隔時間是一分鐘。
    • debug:默認值爲false,當此屬性設置爲true時,將打印出logback的內部日誌,可以實時查看logback的運行狀態。
<configuration scan="true" scanPeriod="60 seconds" debug="false"> 
    ...... 
</configuration>
  • 子節點:用來設置上下文的名稱,默認的上下文名稱爲default,但可以使用設置成其他的名字,用於區分不同應用程序的記錄。
<configuration scan="true" scanPeriod="60 seconds" debug="false"> 
    <contextName>dimples-logback</contextName> 
    ......
</configuration>
  • 子節點:用來定義一個變量,其中有兩個屬性name和value,在logger文件中可以通過${}來取出name對應的property中的value的值。
  • 子節點:配置日誌的具體功能和內容的節點,有name和class屬性,通過class來指定日誌的處理類型。常用的以下二種
ch.qos.logback.core.ConsoleAppender:日誌輸出到控制檯

<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
    <encoder>
        <!-- 設置日誌輸出格式 -->
        <Pattern>${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}}</Pattern>
        <!-- 控制檯也要使用UTF-8,不要使用GBK,否則會中文亂碼 -->
        <charset>UTF-8</charset>
    </encoder>
</appender>
ch.qos.logback.core.rolling.RollingFileAppender:滾動記錄文件

<appender name="INFO_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
   <!-- 正在記錄的日誌文件的路徑及文件名 -->
   <file>C:/springboot-log/logs/info/log_info.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>C:/springboot-log/logs/info/log-info-%d{yyyy-MM-dd-HH}.%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>
  • 除以上兩種日誌處理類型以外,還有其他如
    1、FileAppender:普通的將日誌添加到文件中
    2、SocketAppender、
    3、SMTPAppender、
    4、DBAppender、
    5、SyslogAppender、
    6、SiftingAppender 等等

最後貼上個人在平時的項目中總結的logback的配置文件,分爲debug、info、warn、error四種類型的日誌信息,分別保存到此四個文件夾中,並按大小和日期進行歸檔。滿足大部分的業務場景。

友情鏈接(個人學習的項目總結)GitHub地址
<?xml version="1.0" encoding="UTF-8"?>
<!-- 日誌級別從低到高分爲TRACE < DEBUG < INFO < WARN < ERROR < FATAL,如果設置爲WARN,則低於WARN的信息都不會輸出 -->

<!-- 根節點<configuration>,包含下面三個屬性:-->
<!-- scan: 當此屬性設置爲true時,配置文件如果發生改變,將會被重新加載,默認值爲true。-->
<!-- scanPeriod: 設置監測配置文件是否有修改的時間間隔,如果沒有給出時間單位,默認單位是毫秒。當scan爲true時,此屬性生效。默認的時間間隔爲1分鐘。-->
<!-- debug: 當此屬性設置爲true時,將打印出logback內部日誌信息,實時查看logback運行狀態。默認值爲false。-->
<configuration>
   <contextName>dimples-logback</contextName>
   <!-- name的值是變量的名稱,value的值時變量定義的值。通過定義的值會被插入到logger上下文中。定義變量後,可以使“${}”來使用變量。 -->
   <property name="log.path" value="C:/springboot-log/logs" />

   <!-- 彩色日誌 -->
   <!-- 彩色日誌依賴的渲染類 -->
   <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" />
   <!-- 彩色日誌格式 -->
   <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="log.colorPattern" value="%magenta(%d{yyyy-MM-dd HH:mm:ss}) %highlight(%-5level) %boldCyan([${springAppName:-},%X{X-B3-TraceId:-},%X{X-B3-SpanId:-},%X{X-Span-Export:-}]) %yellow(%thread) %green(%logger) %msg%n"/>
   <property name="log.pattern" value="%d{yyyy-MM-dd HH:mm:ss} %-5level [${springAppName:-},%X{X-B3-TraceId:-},%X{X-B3-SpanId:-},%X{X-Span-Export:-}] %thread %logger %msg%n"/>
   <!-- %m輸出的信息,%p日誌級別,%t線程名,%d日期,%c類的全名,%i索引【從數字0開始遞增】,,, -->
   <!-- appender是configuration的子節點,是負責寫日誌的組件。 -->
   <!-- ConsoleAppender:把日誌輸出到控制檯 -->
   <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
      <encoder>
         <Pattern>${CONSOLE_LOG_PATTERN}</Pattern>
         <!-- 控制檯也要使用UTF-8,不要使用GBK,否則會中文亂碼 -->
         <charset>UTF-8</charset>
      </encoder>
   </appender>

   <!-- 時間滾動輸出 level爲 DEBUG 日誌 -->
   <appender name="DEBUG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
      <!-- 正在記錄的日誌文件的路徑及文件名 -->
      <file>${log.path}\debug/log_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/log-debug-%d{yyyy-MM-dd-HH}.%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>

   <!-- 時間滾動輸出 level爲 INFO 日誌 -->
   <appender name="INFO_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
      <!-- 正在記錄的日誌文件的路徑及文件名 -->
      <file>${log.path}\info/log_info.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}/info/log-info-%d{yyyy-MM-dd-HH}.%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>

   <!-- 時間滾動輸出 level爲 WARN 日誌 -->
   <appender name="WARN_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
      <!-- 正在記錄的日誌文件的路徑及文件名 -->
      <file>${log.path}\warn/log_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/log-warn-%d{yyyy-MM-dd-HH}.%i.log</fileNamePattern>
         <timeBasedFileNamingAndTriggeringPolicy
            class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
            <maxFileSize>100MB</maxFileSize>
         </timeBasedFileNamingAndTriggeringPolicy>
         <!--日誌文件保留天數-->
         <maxHistory>30</maxHistory>
      </rollingPolicy>
      <!-- 此日誌文件只記錄warn級別的 -->
      <filter class="ch.qos.logback.classic.filter.LevelFilter">
         <level>warn</level>
         <onMatch>ACCEPT</onMatch>
         <onMismatch>DENY</onMismatch>
      </filter>
   </appender>
   <!-- RollingFileAppender:滾動記錄文件,先將日誌記錄到指定文件,當符合某個條件時,將日誌記錄到其他文件 -->
   <!--             2.如果日期沒有發生變化,但是當前日誌的文件大小超過1KB時,對當前日誌進行分割 重命名-->
   <!-- 時間滾動輸出 level爲 ERROR 日誌 -->
   <appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
      <!-- 正在記錄的日誌文件的路徑及文件名 -->
      <file>${log.path}\error/log_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">
         <fileNamePattern>${log.path}/error/log-error-%d{yyyy-MM-dd-HH}.%i.log</fileNamePattern>
         <timeBasedFileNamingAndTriggeringPolicy
            class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
            <maxFileSize>100MB</maxFileSize>
         </timeBasedFileNamingAndTriggeringPolicy>
         <!--日誌文件保留天數-->
         <maxHistory>30</maxHistory>
      </rollingPolicy>
      <!-- 此日誌文件只記錄ERROR級別的 -->
      <filter class="ch.qos.logback.classic.filter.LevelFilter">
         <level>ERROR</level>
         <onMatch>ACCEPT</onMatch>
         <onMismatch>DENY</onMismatch>
      </filter>
   </appender>
   <!--開發環境:打印控制檯-->
   <!-- 指定項目中某個包,當有日誌操作行爲時的日誌記錄級別 -->
   <!-- com.dimples.springboot.biz爲業務邏輯根包,也就是隻要是發生在這個根包下面的所有日誌操作行爲的權限都是DEBUG -->
   <!-- 級別依次爲【從高到低】:FATAL > ERROR > WARN > INFO > DEBUG > TRACE  -->
   <springProfile name="dev">
      <logger name="com.dimples.springboot.biz" 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>

   <!--生產環境:輸出到文件-->
   <!--<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>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章