依賴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-spring.xml,logback.xml logging.config=classpath:config/logback.xml
節點 | 說明 |
---|---|
root | 控制項目總體輸出日誌級別,子節點爲appender |
logger | 控制指定包或者類的輸出級別,和引用的appender,子節點爲appender |
appender | 控制日誌輸出形式,格式 |
其它配置web
節點 | 說明 |
---|---|
contextName | 上下文可在輸出的地方用%contextName來引用 |
property | 定義屬性可在節點中經過${propertyName}來使用 |
conversionRule | 自定義格式轉換符,spring已自定義了彩色日誌,異常日誌格式直接引用便可 |
root能夠理解爲一個特定的logger用來控制整個項目的日誌輸出級別。spring
logger下可配置0個或多個appender-ref,用於指定選擇的日誌輸出方式sql
屬性名稱 | 說明 |
---|---|
name | 包名或類名完整路徑 |
level | 指定輸出級別 |
addtivity | 是否向上級傳遞信息,默認爲true |
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
執行一個過濾器會有返回個枚舉值,即DENY,NEUTRAL,ACCEPT其中之一。app
下面簡單介紹一下我使用到的兩個過濾器,其它請參考詳細文檔async
<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>
<filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>ERROR</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter>
<?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>