Spring Boot -logback 使用

簡單使用

依賴html

<dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
        </dependency>
        <!--轉換器log4j 轉 logback-->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>log4j-over-slf4j</artifactId>
        </dependency>
        <!--過濾日誌用到-->
        <dependency>
            <groupId>org.codehaus.janino</groupId>
            <artifactId>janino</artifactId>
        </dependency>
        <!--日誌郵件-->
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-email</artifactId>
            <version>1.5</version>
        </dependency>

配置java

#輸出日誌文件地址
logging.file=E:/LOG/ex.info.log
#日誌輸出級別
logging.level.root=info
#指定org.springframework.web.servlet.DispatcherServlet類日誌級別爲DEBUG
logging.level.org.springframework.web.servlet.DispatcherServlet=debug

開啓logback獨立配置

#指定logback配置文件路徑,若是配置文件在根目錄可自動匹配logback-spring.xml,logback.xml
logging.config=classpath:config/logback.xml

logback配置

核心節點簡介

節點 說明
root 控制項目總體輸出日誌級別,子節點爲appender
logger 控制指定包或者類的輸出級別,和引用的appender,子節點爲appender
appender 控制日誌輸出形式,格式

其它配置web

節點 說明
contextName 上下文可在輸出的地方用%contextName來引用
property 定義屬性可在節點中經過${propertyName}來使用
conversionRule 自定義格式轉換符,spring已自定義了彩色日誌,異常日誌格式直接引用便可

root,logger

root能夠理解爲一個特定的logger用來控制整個項目的日誌輸出級別。spring

logger下可配置0個或多個appender-ref,用於指定選擇的日誌輸出方式sql

屬性名稱 說明
name 包名或類名完整路徑
level 指定輸出級別
addtivity 是否向上級傳遞信息,默認爲true

appender

appender控制日誌輸出到哪裏,用什麼形式輸出,,後續的例子也能夠參考,例子中包含輸出到控制檯,輸出到文件,輸出到郵箱。更詳細的內容請查看官網文檔express

屬性名稱 說明
name appender名稱,在logger或root中經過appender-ref來引用
class 處理日誌的類

日誌信息

日誌內容

appender中encoder標籤用於控制輸出什麼內容輸出的內容包含不少參數下面列舉一些我用到的參數,詳細內容請查看官網文檔apache

名稱 別名 說明
%date{format} %d 日期,format爲格式化方式
%thread %t 線程名
%level %le,%p 日誌級別
%logger{length} %lo,%c 打印日誌的類,length爲輸出的長度,如輸出類名稱過長則會進行縮寫
%method %M 打印日誌的方法,影響性能謹慎使用
%caller 調用方法的堆棧,有其它參數請參見官網文檔
%message %msg,%m 日誌內容
%xException %xEx,%xThrowable 異常堆棧,包含包名
%n 當前系統中換行符

日誌格式

例子:%-20.30logger 說明mvc

  • -:表示居左,默認居右
  • 20:表示最小長度,不夠的補全空格
  • 30:表示最大長度,超出的自動裁剪,logger會簡寫包名

過濾器

執行一個過濾器會有返回個枚舉值,即DENY,NEUTRAL,ACCEPT其中之一。app

  • **DENY:**日誌將當即被拋棄再也不通過其餘過濾器
  • **NEUTRAL:**有序列表裏的下個過濾器過接着處理日誌
  • **ACCEPT:**日誌會被當即處理,再也不通過剩餘過濾器

下面簡單介紹一下我使用到的兩個過濾器,其它請參考詳細文檔async

  • 日誌內容過濾器 ch.qos.logback.core.filter.EvaluatorFilter:經過指定條件來控制是否輸出,其中expression爲java代碼可直接使用java中方法。
<appender name="REQUEST_CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
  <filter class="ch.qos.logback.core.filter.EvaluatorFilter">
   <evaluator> <!-- 默認爲 ch.qos.logback.classic.boolex.JaninoEventEvaluator || message.startsWith("Returning handler method")-->
    <expression>
     <![CDATA[
     return (!message.contains(".") && message.startsWith("Looking up handler method")) ;
     ]]>
    </expression>
   </evaluator>
   <OnMatch>ACCEPT</OnMatch>
   <OnMismatch>DENY</OnMismatch>
  </filter>
 </appender>
  • 日誌級別過濾器 ch.qos.logback.classic.filter.LevelFilter:經過指定日誌級別來過濾
<filter class="ch.qos.logback.classic.filter.LevelFilter">
   <level>ERROR</level>
   <onMatch>ACCEPT</onMatch>
   <onMismatch>DENY</onMismatch>
  </filter>

logback配置例子

<?xml version="1.0" encoding="UTF-8"?>

<!--
scan: 當此屬性設置爲true時,配置文件若是發生改變,將會被從新加載,默認值爲true。
scanPeriod: 設置監測配置文件是否有修改的時間間隔,若是沒有給出時間單位,默認單位是毫秒。當scan爲true時,此屬性生效。默認的時間間隔爲1分鐘。
debug: 當此屬性設置爲true時,將打印出logback內部日誌信息,實時查看logback運行狀態。默認值爲false。 -->
<configuration >
 <!--定義日誌文件的存儲地址 勿在 LogBack 的配置中使用相對路徑-->
 <property name="log.path.root" value="E:/log/" />
 <!--編碼-->
 <property name="log.charset" value="UTF-8" />

 <!-- 控制檯財色輸出 -->
 <conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter" />
 <!-- spring 美化異常輸出 -->
 <conversionRule conversionWord="wex" converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter" />
 <conversionRule conversionWord="wEx" converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter" />
 <!--日誌格式 -->
 <property name="log.pattern.file" value="%d{yyyy-MM-dd HH:mm:ss.SSS}%-5level ${PID:- } --- [%thread] %logger : %msg%n%xException" />
 <property name="log.pattern.error.file" value="%d{yyyy-MM-dd HH:mm:ss.SSS}%-5level ${PID:- } --- [%thread] %logger %method : %msg%n%caller{1..3}%xException" />
 <!-- 彩色日誌格式 -->
 <property name="log.pattern.console" value="%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}) %clr(%-5level) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%-10.10thread]){faint} %clr(%-40.40logger{39}){blue} %clr(:){faint} %m%n%xException" />

 <!-- 控制檯輸出-->
 <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
  <encoder charset="${log.charset}">
   <pattern>${log.pattern.console}</pattern>
  </encoder>
 </appender>
 <!-- info 日誌文件 -->
 <appender name="INFO_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
  <file>${log.path.root}ex.info.log</file>
  <append>true</append>
  <encoder charset="${log.charset}">
   <pattern>${log.pattern.file}</pattern>
  </encoder>
  <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"><!-- 滾動策略 大小 策略 -->
   <fileNamePattern>${log.path.root}/%d{yyyy-MM-dd}exinfo-%i.log</fileNamePattern>
   <maxFileSize>10MB</maxFileSize><!-- 單個日誌大小 -->
   <maxHistory>30</maxHistory><!--保留的歸檔文件的最大數量 -->
  </rollingPolicy>
 </appender>
 <!-- warn 日誌文件 -->
 <appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
  <file>${log.path.root}ex.error.log</file>
  <append>true</append>
  <encoder charset="${log.charset}">
   <pattern>${log.pattern.error.file}</pattern>
  </encoder>
  <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"><!-- 滾動策略 大小 策略 -->
   <fileNamePattern>${log.path.root}/%d{yyyy-MM-dd}exerror-%i.log</fileNamePattern>
   <maxFileSize>10MB</maxFileSize><!-- 單個日誌大小 -->
   <maxHistory>30</maxHistory><!--保留的歸檔文件的最大數量 -->
   <totalSizeCap>${total.size.cap}</totalSizeCap>
  </rollingPolicy>
 </appender>

 <!-- 請求日誌過濾-->
 <appender name="REQUEST_CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
  <filter class="ch.qos.logback.core.filter.EvaluatorFilter">
   <evaluator> <!-- 默認爲 ch.qos.logback.classic.boolex.JaninoEventEvaluator || message.startsWith("Returning handler method")-->
    <expression>
     <![CDATA[
     return (!message.contains(".") && message.startsWith("Looking up handler method")) ;
     ]]>
    </expression>
   </evaluator>
   <OnMatch>ACCEPT</OnMatch>
   <OnMismatch>DENY</OnMismatch>
  </filter>
  <encoder charset="${log.charset}">
   <pattern>${log.pattern.console}</pattern>
  </encoder>
 </appender>

 <appender name="REQUEST_FLOW_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
  <file>${log.path.root}ex.request.flow.log</file>
  <append>true</append>
  <encoder charset="${log.charset}">
   <pattern>${log.pattern.file}</pattern>
  </encoder>
  <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"><!-- 滾動策略 大小 策略 -->
   <fileNamePattern>${log.path.root}/%d{yyyy-MM-dd}ex.request.flow-%i.log</fileNamePattern>
   <maxFileSize>10MB</maxFileSize><!-- 單個日誌大小 -->
   <maxHistory>30</maxHistory><!--保留的歸檔文件的最大數量 -->
   <totalSizeCap>${total.size.cap}</totalSizeCap>
  </rollingPolicy>
 </appender>

 <!-- ERROR郵件發送 -->
 <appender name="EMAIL" class="ch.qos.logback.classic.net.SMTPAppender">
  <smtpHost>smtp.126.com</smtpHost>
  <smtpPort>25</smtpPort>
  <username>xx@mail.com</username>
  <password>password</password>
  <asynchronousSending>true</asynchronousSending>
  <SSL>true</SSL>
  <to>xx@mail.com</to>
  <from>xx@mail.com</from>
  <subject>%d{yyyy-MM-dd HH:mm:ss.SSS}錯誤日誌</subject>
  <layout>
   <Pattern>${log.pattern.error.file}}</Pattern>
  </layout>
  <cyclicBufferTracker class="ch.qos.logback.core.spi.CyclicBufferTracker">
   <!-- 緩衝的日誌數量 -->
   <bufferSize>5</bufferSize>
  </cyclicBufferTracker>
       <!-- 這裏採用等級過濾器 指定等級相符才發送 -->
  <filter class="ch.qos.logback.classic.filter.LevelFilter">
   <level>ERROR</level>
   <onMatch>ACCEPT</onMatch>
   <onMismatch>DENY</onMismatch>
  </filter>
 </appender>

 <!--系統警告日誌打印到單獨日誌文件-->
 <logger name="com.bmw.frame" level="ERROR" additivity="false">
  <appender-ref ref="CONSOLE" />
  <appender-ref ref="ERROR_FILE" />
 </logger>

 <!--系統警告日誌打印到單獨日誌文件-->
 <logger name="com.example.test" level="TRACE" additivity="false">
  <appender-ref ref="CONSOLE" />
  <appender-ref ref="INFO_FILE" />
 </logger>

 <!-- 1. 輸出SQL 到控制檯和文件,生產環境視狀況打開-->
 <logger name="org.hibernate.SQL" level="DEBUG" additivity="false" >
  <!--<appender-ref ref="CONSOLE" />-->
  <appender-ref ref="INFO_FILE" />
 </logger>

 <!-- 2. 輸出SQL 的參數到控制檯和文件,生產環境視狀況打開-->
 <logger name="org.hibernate.type.descriptor.sql.BasicBinder" level="TRACE" additivity="false" >
  <!--<appender-ref ref="CONSOLE" />-->
  <appender-ref ref="INFO_FILE" />
 </logger>

 <!--
 3 輸出請求路徑到文件
 org.springframework.web.servlet.DispatcherServlet 沒有請求執行的方法因此使用當前日誌
 -->
 <logger name="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping" level="DEBUG" additivity="false" >
  <appender-ref ref="REQUEST_CONSOLE" />
  <appender-ref ref="INFO_FILE" />
 </logger>
 <!--
 4 輸出請求耗時流水到文件,生產環境視狀況打開-->
 -->
 <logger name="org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext" level="TRACE" additivity="false" >
  <appender-ref ref="REQUEST_FLOW_FILE" />
 </logger>
 <!-- 日誌輸出級別 -->
 <root level="INFO">
  <appender-ref ref="CONSOLE" />
  <appender-ref ref="INFO_FILE" />
 </root>
</configuration>

參考資料

https://aub.iteye.com/blog/1101222

https://logback.qos.ch/manual/layouts.html

相關文章
相關標籤/搜索