2019獨角獸企業重金招聘Python工程師標準>>>
簡單使用
依賴
<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>
配置
#輸出日志文件地址
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 | 控制日志輸出形式,格式 |
其它配置
節點 | 說明 |
---|---|
contextName | 上下文可在輸出的地方用%contextName來引用 |
property | 定義屬性可在節點中通過${propertyName}來使用 |
conversionRule | 自定義格式轉換符,spring已自定義了彩色日志,異常日志格式直接引用即可 |
root,logger
root可以理解為一個特定的logger用來控制整個項目的日志輸出級別。
logback的配置文件不起作用、logger下可配置0個或多個appender-ref,用于指定選擇的日志輸出方式
屬性名稱 | 說明 |
---|---|
name | 包名或類名完整路徑 |
level | 指定輸出級別 |
addtivity | 是否向上級傳遞信息,默認為true |
appender
appender控制日志輸出到哪里,用什么形式輸出,,后續的例子也可以參考,例子中包含輸出到控制臺,輸出到文件,輸出到郵箱。更詳細的內容請查看官網文檔
屬性名稱 | 說明 |
---|---|
name | appender名稱,在logger或root中通過appender-ref來引用 |
class | 處理日志的類 |
日志信息
日志內容
appender中encoder標簽用于控制輸出什么內容輸出的內容包含很多參數下面列舉一些我用到的參數,詳細內容請查看官網文檔
名稱 | 別名 | 說明 |
---|---|---|
%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 說明
- -:表示居左,默認居右
- 20:表示最小長度,不夠的補全空格
- 30:表示最大長度,超出的自動裁剪,logger會簡寫包名
過濾器
執行一個過濾器會有返回個枚舉值,即DENY,NEUTRAL,ACCEPT其中之一。
- **DENY:**日志將立即被拋棄不再經過其他過濾器
- **NEUTRAL:**有序列表里的下個過濾器過接著處理日志
- **ACCEPT:**日志會被立即處理,不再經過剩余過濾器
下面簡單介紹一下我使用到的兩個過濾器,其它請參考詳細文檔
- 日志內容過濾器 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>
參考資料
slf4j和logback區別。https://aub.iteye.com/blog/1101222
https://logback.qos.ch/manual/layouts.html