<!-- logback+slf4j --> <!-- slf4j依賴 --> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.6.0</version> <type>jar</type> <scope>compile</scope> </dependency> <!-- logback依賴 --> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-core</artifactId> <version>0.9.28</version> <type>jar</type> </dependency> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>0.9.28</version> <type>jar</type> </dependency>
<listener> <listener-class>ch.qos.logback.ext.spring.web.LogbackConfigListener</listener-class> </listener> <context-param> <param-name>logbackConfigLocation</param-name> <param-value>classpath:logback.xml</param-value> </context-param>
注意: logback.xml的文件html
<?xml version="1.0" encoding="UTF-8"?> <!-- 從高到地低 OFF 、 FATAL 、 ERROR 、 WARN 、 INFO 、 DEBUG 、 TRACE 、 ALL --> <!-- 日誌輸出規則 根據當前ROOT 級別,日誌輸出時,級別高於root默認的級別時 會輸出 --> <!-- 如下 每一個配置的 filter 是過濾掉輸出文件裏面,會出現高級別文件,依然出現低級別的日誌信息,經過filter 過濾只記錄本級別的日誌--> <!-- debug:當此屬性設置爲true時,將打印出logback內部日誌信息,實時查看logback運行狀態。默認值爲false --> <!-- scan:配置文件若是發生改變,是否被從新加載,默認爲true。 --> <!-- scanPeriod:設置檢測配置文件是否有修改的時間間隔,若是沒有給出時間單位,默認單位是毫秒,默認的時間間隔爲1分鐘。當scan爲true時,此屬性生效。 --> <configuration debug="true" scan="true" scanPeriod="30 seconds"> <!--定義變量--> <property name="APP_NAME" value="instSite" /> <!-- PROJECT_NAME=項目名稱 LOG_HOME=日誌輸出 LOG_LEVEL=日誌級別 --> <contextName>${APP_NAME}</contextName> <!-- 時間戳定義,timeReference:使用日誌產生日期爲時間基準 --> <timestamp key="byDay" datePattern="yyyy-MM-dd" timeReference="contextBirth"/> <!--定義日誌文件的存儲地址 勿在 LogBack 的配置中使用相對路徑,可使用系統變量 --> <!--<property name="LOG_OUTPUT" value="日誌輸入路徑"/>--> <!-- ===================================================================== --> <!-- 如下是appender的定義 --> <!-- ===================================================================== --> <!-- 控制檯輸出,生產環境將請stdout去掉 --> <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <!-- 過濾器,一個appender能夠有多個 --> <!-- 閾值過濾,就是log行爲級別過濾,debug及debug以上的信息會被打印出來 --> <!--ThresholdFilter: 臨界值過濾器,過濾掉低於指定臨界值的日誌。當日志級別等於或高於臨界值時,過濾器返回NEUTRAL;當日志級別低於臨界值時,日誌會被拒絕。例如:過濾掉全部低於debug級別的日誌。--> <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> <level>debug</level> </filter> <!-- encoders are assigned the type ch.qos.logback.classic.encoder.PatternLayoutEncoder by default --> <!-- encoder編碼規則 --> <encoder> <!-- 經常使用的Pattern變量,你們可打開該pattern進行輸出觀察 --> <!-- <pattern> %d{yyyy-MM-dd HH:mm:ss} [%level] - %msg%n Logger: %logger Class: %class File: %file Caller: %caller Line: %line Message: %m Method: %M Relative: %relative Thread: %thread Exception: %ex xException: %xEx nopException: %nopex rException: %rEx Marker: %marker %n </pattern> --> <!--格式化輸出:%d表示日期,%thread表示線程名,%-5level:級別從左顯示5個字符寬度,%msg:日誌消息,%n是換行符 --> <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern> <!--<pattern>%d %contextName %msg%n</pattern>--> <!--<pattern>%-4d [%green(%thread)] %highlight(%-5level) %cyan(%logger).%-10method - %message%n</pattern>--> </encoder> </appender> <!-- ===================================================================== --> <!-- 按照天天生成日誌文件 --> <!--RollingFileAppender起做用,必須同時設置 RollingPolicy 和 TriggeringPolicy。不過,若是 RollingPolicy 也實現了 TriggeringPolicy 接口,那麼只須要設置 RollingPolicy。--> <appender name="OTHER_LOG" class="ch.qos.logback.core.rolling.RollingFileAppender"> <!-- 日誌輸出文件 --> <file>${LOG_HOME}/${PROJECT_NAME}.log</file> <!-- 追加日誌到原文件結尾,默認爲true --> <append>true</append> <!--<filter>標籤。 過濾器,執行一個過濾器會有返回個枚舉值,即DENY,NEUTRAL,ACCEPT其中之一。 返回DENY,日誌將當即被拋棄再也不通過其餘過濾器; 返回NEUTRAL,有序列表裏的下個過濾器過接着處理日誌; 返回ACCEPT,日誌會被當即處理,再也不通過剩餘過濾器。 過濾器被添加到<Appender> 中,爲<Appender> 添加一個或多個過濾器後,能夠用任意條件對日誌進行過濾。<Appender> 有多個過濾器時,按照配置順序執行。 --> <!--不打印 INFO and ERROR 級別的日誌--> <!--LevelFilter: 級別過濾器,根據日誌級別進行過濾。若是日誌級別等於配置級別,過濾器會根據onMath 和 onMismatch接收或拒絕日誌。--> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <!--設置過濾級別--> <level>INFO</level> <!--用於配置符合過濾條件的操做--> <onMatch>DENY</onMatch> <!--用於配置不符合過濾條件的操做--> <onMismatch>NEUTRAL</onMismatch> </filter> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>ERROR</level> <onMatch>DENY</onMatch> <onMismatch>ACCEPT</onMismatch> </filter> <!-- timebasedrollingpolicy:演示時間和大小爲基礎的日誌文件歸檔 --> <!--RollingPolicy,負責滾動。第二個是 TriggeringPolicy,決定是否以及什麼時候進行滾動--> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!-- 歸檔的日誌文件的路徑,例現在天是2013-12-21日誌,當前寫的日誌文件路徑爲file節點指定。 --> <!--能夠將此文件與file指定文件路徑設置爲不一樣路徑,從而將當前日誌文件或歸檔日誌文件置不一樣的目錄。 --> <!--而2013-12-21的日誌文件在由fileNamePattern指定。%d{yyyy-MM-dd}指定日期格式,%i指定索引 --> <!-- 文件滾動日期格式:天天:.YYYY-MM-dd(默認);每星期:.YYYY-ww;每個月:.YYYY-MM --> <!-- 每隔半天:.YYYY-MM-dd-a;每小時:.YYYY-MM-dd-HH;每分鐘:.YYYY-MM-dd-HH-mm --> <!-- %i 第幾個文件,固定大小後,同一天可能有多個--> <!--"fileNamePattern"表明歸檔(滾動)記錄文件的文件名模式。該選項是必需的,且必需在模式的某處包含標誌"%i"--> <fileNamePattern>${LOG_HOME}/${PROJECT_NAME}.log.%d{yyyy-MM-dd}-%i</fileNamePattern> <!-- 控制歸檔文件的最大數量的保存,刪除舊的文件,默認單位天數 --> <MaxHistory>30</MaxHistory> <!-- 設置當前日誌的文件的大小,決定日誌翻滾 --> <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> <!-- 除按日誌記錄以外,還配置了日誌文件不能超過200M(默認),若超過200M,日誌文件會以索引0開始, --> <maxFileSize>200MB</maxFileSize> </timeBasedFileNamingAndTriggeringPolicy> </rollingPolicy> <!-- encoders 做用是將logger事件轉換成字節數組,並將字節數組寫入到輸出流--> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %class{50} #%line - %msg%n</pattern> <charset>utf-8</charset> </encoder> </appender> <!-- 能夠寫多個日誌文件appender,而後區分多個模塊的日誌 或者 分離不一樣級別的日誌 --> <appender name="INFO_LOG" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>${LOG_HOME}/${PROJECT_NAME}_info.log</file> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>INFO</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>${LOG_HOME}/${PROJECT_NAME}_info.log.%d{yyyy-MM-dd}-%i</fileNamePattern> <MaxHistory>30</MaxHistory> <!--日誌文件最大的大小 --> <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> <maxFileSize>200MB</maxFileSize> </timeBasedFileNamingAndTriggeringPolicy> </rollingPolicy> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %class{50} #%line - %msg%n</pattern> <charset>utf-8</charset> </encoder> </appender> <appender name="ERROR_LOG" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>${LOG_HOME}/${PROJECT_NAME}_error.log</file> <!--過濾到ERROR級別的日誌--> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>ERROR</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>${LOG_HOME}/${PROJECT_NAME}_error.log.%d{yyyy-MM-dd}-%i</fileNamePattern> <MaxHistory>30</MaxHistory> <!--日誌文件最大的大小 --> <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> <maxFileSize>200MB</maxFileSize> </timeBasedFileNamingAndTriggeringPolicy> </rollingPolicy> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %class{50} #%line - %msg%n</pattern> <charset>utf-8</charset> </encoder> </appender> <!-- ===================================================================== --> <!-- FileAppender 輸出到文件 --> <appender name="FILE" class="ch.qos.logback.core.FileAppender"> <!-- 文件存放位置 %{xxx} 就是以前定義的屬性xxx --> <file>${LOG_HOME}/myApp1log-${byDay}.log</file> <encoder> <!-- %date和%d是一個意思 %file是所在文件 %line是所在行 --> <pattern>%date %level [%thread] %logger{30} [%file:%line] %msg%n</pattern> </encoder> </appender> <!-- 輸出到HTML格式的文件 --> <appender name="HTMLFILE" class="ch.qos.logback.core.FileAppender"> <!-- 過濾器,這個過濾器是行爲過濾器,直接過濾掉了除debug外全部的行爲信息 --> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>debug</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder"> <!-- HTML輸出格式 能夠和上邊差很少 --> <layout class="ch.qos.logback.classic.html.HTMLLayout"> <pattern>%relative%thread%mdc%level%logger%msg</pattern> </layout> </encoder> <file>${LOG_HOME}/test.html</file> </appender> <!-- ===================================================================== --> <!-- 如下是logger的定義 --> <!-- ===================================================================== --> <!-- Root logger的定義 --> <!-- root, 只有在level及以上級別的日誌會被輸出 --> <!-- 例如: 當root level設置爲INFO時, appender DEBUG中沒法獲取到DEBUG級別的日誌事件, 則DEBUG日誌信息也不會寫入debug.log中. --> <root> <level value="${LOG_LEVEL}"/> <appender-ref ref="STDOUT"/> </root> <!-- 爲單獨的包配置日誌級別,若root的級別大於此級別, 此處級別也會輸出 應用場景:生產環境通常不會將日誌級別設置爲trace或debug,可是爲詳細的記錄SQL語句的狀況, 可將hibernate的級別設置爲debug,如此一來,日誌文件中就會出現hibernate的debug級別日誌, 而其它包則會按root的級別輸出日誌,OFF 不輸出日誌 --> <logger name="org.hibernate.SQL" level="OFF"/> <logger name="org.hibernate.jdbc" level="DEBUG"/> <logger name="org.springframework" level="DEBUG"/> <!-- 指定一個包,name必填,additivity選填:控制是否繼承父類appender,默認true --> <!-- level選填,若是沒有指定從最近的父類繼承,頂級爲root的級別 --> <logger name="com.jv.messagecenter.servlet" level="DEBUG" additivity="true"> <level>debug</level> <appender-ref ref="INFO_LOG"/> <appender-ref ref="ERROR_LOG"/> <appender-ref ref="OTHER_LOG"/> <appender-ref ref="FILE"/> <appender-ref ref="HTMLFILE"/> </logger> </configuration>
level:用來設置打印級別,大小寫無關:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF(屏蔽),java
EvaluatorFilter: 求值過濾器,評估、鑑別日誌是否符合指定條件。有一會兒節點:<evaluator>:鑑別器,經常使用的鑑別器是JaninoEventEvaluato,也是默認的鑑別器,它以任意的java布爾值表達式做爲求值條件,求值條件在配置文件解釋過成功被動態編譯,布爾值表達式返回true就表示符合過濾條件web
自定義過濾器spring
import ch.qos.logback.classic.spi.ILoggingEvent; import ch.qos.logback.core.filter.Filter; import ch.qos.logback.core.spi.FilterReply; public class LinkinFilter extends Filter<ILoggingEvent>{ @Override public FilterReply decide(ILoggingEvent event) { if (event.getMessage().contains("LinkinPark")) { return FilterReply.ACCEPT; }else{ return FilterReply.DENY; } } }
logback內置的日誌字段仍是比較少,自定義的一些數據,須要藉助logback MDC機制,,即將一些運行時的上下文數據經過logback打印出來;此時咱們須要藉助org.sl4j.MDC類。api
MDC類基本原理其實很是簡單,其內部持有一個InheritableThreadLocal實例,用於保存context數據,MDC提供了put/get/clear等幾個核心接口,用於操做ThreadLocal中的數據;ThreadLocal中的K-V,能夠在logback.xml中聲明,最終將會打印在日誌中。數組
logback 中 MDC 的過濾器session
ch.qos.logback.classic.helpers.MDCInsertingServletFilter
一個 Spring 的環繞切面app
@Around("execution(* com.wuage.payway.shared.api.account.service.*.*(..))") public Object doAroundAdvice(ProceedingJoinPoint proceedingJoinPoint){ MDC.put("sessionId", UUID.randomUUID().toString()); System.out.println("環繞通知的目標方法名 Start:"+proceedingJoinPoint.getSignature().getName()); try { Object obj = proceedingJoinPoint.proceed(); return obj; } catch (Throwable throwable) { throwable.printStackTrace(); } MDC.remove("sessionId"); // MDC.clear(); return null; }
<pattern>%X{sessionId} %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %class{50} #%line - %msg%n</pattern>
logback的官方網站: http://logback.qos.chdom
SLF4J的官方網站:http://www.slf4j.orgide
LogBack中文手冊
http://blog.csdn.net/shift_alt_ctrl/article/details/69944606
https://my.oschina.net/CasparLi/blog/822253
http://www.cnblogs.com/softidea/p/5642174.html
http://blog.csdn.net/u011794238/article/details/50770557#t7
http://blog.csdn.net/u011794238/article/details/50767869