LogBack 實例

1.MAVEN 配置

<!-- 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>

2.Web 配置 

<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>

3.Logback.xml實例

    注意: 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;  
        }  
    }  
}

 

4.MDC特性的使用

      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

Java 程序

  一個 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>

4.參考:

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

相關文章
相關標籤/搜索