青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

大龍的博客

常用鏈接

統(tǒng)計(jì)

最新評(píng)論

用slf4j+logback實(shí)現(xiàn)多功能日志解決方案 --- 轉(zhuǎn)

大家都知道,slf4j是原來log4j的作者寫的一個(gè)新的日志組件,意思是簡(jiǎn)單日志門面接口,可以跟其他日志組件配合使用,常用的配合是slf4j+logback,無論從功能上還是從性能上都較之log4j有了很大的提升,我想很多用戶都已經(jīng)嘗試,并應(yīng)用到項(xiàng)目中。
對(duì)于日志記錄,說實(shí)話,以前用過log4j,但沒有深入研究,用其最簡(jiǎn)單的功能。有幸在項(xiàng)目中用到了slf4j,來解決一個(gè)稍微復(fù)雜點(diǎn)的日志記錄需求。于是便深入研究了下,下邊將自己的研究成果與大家分享:
首先描述下需要解決的問題:
比如有如下包:
com.spike.test.a
com.spike.test.b
com.spike.test.c
com.spike.test.d
com.spike.test
我的配置日志需求:
A. com.spike.test.a的日志級(jí)別任意設(shè)置,單獨(dú)一日志文件,獨(dú)立的日志級(jí)別。
B. com.spike.test.b的日志級(jí)別任意設(shè)置,單獨(dú)一日志文件,獨(dú)立的日志級(jí)別。
C. com.spike.test.b的日志級(jí)別任意設(shè)置,單獨(dú)一日志文件,獨(dú)立的日志級(jí)別。
D. com.spike.test.b的日志級(jí)別任意設(shè)置,單獨(dú)一日志文件,獨(dú)立的日志級(jí)別。
E. com.spike.test的日志記錄需求:
1)記錄所有的info級(jí)別的日志,也就是不記錄debug級(jí)別日志,單獨(dú)一個(gè)日志文件,可以看到整個(gè)系統(tǒng)的所有info級(jí)別以上的日志記錄。且該配置不受A,B,C,D,E其他配置的任何影響。
2)記錄所有的error級(jí)別的日志,也就是不記錄debug,info,warn級(jí)別日志,單獨(dú)一個(gè)日志文件,可以看到整個(gè)系統(tǒng)的所有error級(jí)別日志記錄。且該配置不受A,B,C,D,E其他配置的任何影響。

一 準(zhǔn)備相關(guān)工具
1.  從網(wǎng)上下載slf4j組件和logback相關(guān)的jar包,很多網(wǎng)站都有,logback可以直接到這個(gè)網(wǎng)站下載http://logback.qos.ch/http://www.slf4j.org/可以直接到這里下載http://www.slf4j.org/。總之,不管在哪里下載,你都需要找到以下幾個(gè)jar包(可能根據(jù)需要,有個(gè)別不需要,這個(gè)沒有詳細(xì)研究,讀者可以自己研究下):
1)  logback-acces-0.9.18.jar
2)  logback-classic-0.9.18.jar
3)  logback-core-0.9.18.jar
4)  slf4j-api-1.5.6.jar

2. 準(zhǔn)備測(cè)試環(huán)境:
1)建立一個(gè)JAVA工程,比如是LogTest,工程整體目錄結(jié)構(gòu)如下(csdn的博客發(fā)圖很不方便,也許我不會(huì) 用,暫時(shí)描述下吧),工程根目錄除了src目錄外,新建一個(gè)lib目錄,將上邊4個(gè)jar包放入并導(dǎo)入工程。再新建一個(gè)config目錄,用于存放日志配 置文件logback.xml,這個(gè)文件如何配置,后邊再介紹。
2)建立測(cè)試類以及相關(guān)包:
包結(jié)構(gòu)以及包類的文件如下:
com.spike.test.a
TestA.java
com.spike.test.b
TestB.java
com.spike.test.c
TestC.java
com.spike.test.d
TestD.java
com.spike.test:
Start.java
其中TestA.java類的測(cè)試代碼如下,其他4個(gè)類代碼類似:
package com.spike.test.a;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class TestA {
         private static Logger log = LoggerFactory.getLogger(TestA.class);
         public TestA()
         {
                   log.debug("TestA-debug");
                   log.info("TestA-info");
                   log.warn("TestA-warn");
                   log.error("TestA-error");
         }
}

目的很簡(jiǎn)單,就是在構(gòu)造函數(shù)中打印各種級(jí)別的log日志信息,TestB.java如下:
package com.spike.test.b;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class TestB {
         private static Logger log = LoggerFactory.getLogger(TestB.class);
         public TestB()
         {
                   log.debug("TestB-debug");
                   log.info("TestB-info");
                   log.warn("TestB-warn");
                   log.error("TestB-error");
         }
}

其他2個(gè)文件就不再此列出,大家應(yīng)該想得到,
啟動(dòng)類Start.java內(nèi)容如下:
package com.spike.test;
import com.spike.test.a.TestA;
import com.spike.test.b.TestB;
import com.spike.test.c.TestC;
import com.spike.test.d.TestD;

public class Start {
    public static void main(String[] args) {
        TestA a = new TestA();
        TestB b = new TestB();
        TestC c = new TestC();
        TestD d = new TestD();
    }

}

2.  建立logback.xml配置文件
前面說過了,在config目錄下建立了logback.xml文件,但文件內(nèi)容沒有介紹,下邊說說:
先介紹最簡(jiǎn)單的一個(gè)配置,如配置文件內(nèi)容如下:
<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
    <appender name="a" class="ch.qos.logback.core.rolling.RollingFileAppender">
       <File>./log/mylog_a_debug.log</File>
       <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
         <FileNamePattern>./log/mylog_a_debug.%i.log</FileNamePattern>   
         <MinIndex>1</MinIndex>   
         <MaxIndex>5</MaxIndex>   
       </rollingPolicy> 
       <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy"> 
         <MaxFileSize>5MB</MaxFileSize>   
       </triggeringPolicy> 
       <layout class="ch.qos.logback.classic.PatternLayout"> 
        <Pattern>%date [%thread] %-5level %logger{80} - %msg%n</Pattern>   
       </layout> 
    </appender>
 <logger name="com.spike.test.a" level="DEBUG"> 
     <appender-ref ref="a" />
 </logger>
 </configuration> 

配置的意思是把com.spike.test.a包下的debug級(jí)別的日志全部記錄到這個(gè)日志文件./log /mylog_a_debug.log中。一個(gè)appender代表一個(gè)具體的日志配置項(xiàng)目,可以通過name屬性的名字在logger節(jié)點(diǎn)中通過 appender-ref引用。具體不細(xì)說。
下邊運(yùn)行下配置結(jié)果,看是否跟我們想的一致。
運(yùn)行前,先要配置個(gè)啟動(dòng)參數(shù),,否則日志直接到控制臺(tái)了,在ECLIPSE啟動(dòng)參數(shù)里加入如下代碼:
-Dlogback.configurationFile=./config/logback.xml
這個(gè)主要是告訴系統(tǒng)日志配置文件放在哪里。
啟動(dòng)程序運(yùn)行!
然后到跟/log/目錄下,我們會(huì)看到有一個(gè)新的文件mylog_a_debug.log,打開看到內(nèi)容如下:
2009-12-27 09:19:30,718 [main] DEBUG com.spike.test.a.TestA - TestA-debug
2009-12-27 09:19:30,718 [main] INFO  com.spike.test.a.TestA - TestA-info
2009-12-27 09:19:30,718 [main] WARN  com.spike.test.a.TestA - TestA-warn
2009-12-27 09:19:30,718 [main] ERROR com.spike.test.a.TestA - TestA-error
正好實(shí)現(xiàn)我們的簡(jiǎn)單需求。

3.  根據(jù)我們的真實(shí)需求,修改logback.xml文件:
對(duì)于A,B,C,D4個(gè)日志配置需求,很簡(jiǎn)單,直接參考剛才的配置,拷貝三份,修改相關(guān)參數(shù)就可以實(shí)現(xiàn),這里不再贅述,可以在后邊的配置文件中看到配置。
下邊重點(diǎn)說說需求E的配置:
1) E配置的第一個(gè)需求:記錄所有的info級(jí)別的日志,也就是不記錄debug級(jí)別日志,單獨(dú)一個(gè)日志文件,可以看到整個(gè)系統(tǒng)的所有info級(jí)別以上的日志記錄。且該配置不受A,B,C,D,E其他配置的任何影響,我們按常規(guī)的配置思路。
首先增加root節(jié)點(diǎn)配置,如下:

<root> 
     <appender-ref ref="all_info" level="INFO" />  
</root> 

然后增加all_info對(duì)應(yīng)的appender節(jié)點(diǎn)的配置,如下:
    <appender name="all_info" class="ch.qos.logback.core.rolling.RollingFileAppender">
       <File>./log/mylog_all_info.log</File>
       <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
         <FileNamePattern>./log/mylog_all_info.%i.log</FileNamePattern>   
         <MinIndex>1</MinIndex>   
         <MaxIndex>5</MaxIndex>   
       </rollingPolicy> 
       <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy"> 
         <MaxFileSize>5MB</MaxFileSize>   
       </triggeringPolicy> 
       <layout class="ch.qos.logback.classic.PatternLayout"> 
        <Pattern>%date [%thread] %-5level %logger{80} - %msg%n</Pattern>   
       </layout> 
    </appender>  
2)  E配置的第2個(gè)需求:記錄所有的error級(jí)別的日志,也就是不記錄debug,info,warn級(jí)別日志,單獨(dú)一個(gè)日志文件,可以看到整個(gè)系統(tǒng)的所有error級(jí)別日志記錄。且該配置不受A,B,C,D,E其他配置的任何影響,我們參考第一個(gè)需求配置如下:
<root> 
     <appender-ref ref="all_info" level="INFO" />
    <appender-ref ref="all_error" level="error" />   
 </root> 
    <appender name="all_error" class="ch.qos.logback.core.rolling.RollingFileAppender">
       <File>./log/mylog_all_error.log</File>
       <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
         <FileNamePattern>./log/mylog_all_error.%i.log</FileNamePattern>   
         <MinIndex>1</MinIndex>   
         <MaxIndex>5</MaxIndex>   
       </rollingPolicy> 
       <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy"> 
         <MaxFileSize>5MB</MaxFileSize>   
       </triggeringPolicy> 
       <layout class="ch.qos.logback.classic.PatternLayout"> 
        <Pattern>%date [%thread] %-5level %logger{80} - %msg%n</Pattern>   
       </layout> 
</appender>
 OK,全部配置完了,整個(gè)logback.xml的配置文件如下:
<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
    <appender name="all_error" class="ch.qos.logback.core.rolling.RollingFileAppender">
       <File>./log/mylog_all_error.log</File>
       <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
         <FileNamePattern>./log/mylog_all_error.%i.log</FileNamePattern>   
         <MinIndex>1</MinIndex>   
         <MaxIndex>5</MaxIndex>   
       </rollingPolicy> 
       <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy"> 
         <MaxFileSize>5MB</MaxFileSize>   
       </triggeringPolicy> 
       <layout class="ch.qos.logback.classic.PatternLayout"> 
        <Pattern>%date [%thread] %-5level %logger{80} - %msg%n</Pattern>   
       </layout> 
    </appender>

    <appender name="all_info" class="ch.qos.logback.core.rolling.RollingFileAppender">
       <File>./log/mylog_all_info.log</File>
       <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
         <FileNamePattern>./log/mylog_all_info.%i.log</FileNamePattern>   
         <MinIndex>1</MinIndex>   
         <MaxIndex>5</MaxIndex>   
       </rollingPolicy> 
       <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy"> 
         <MaxFileSize>5MB</MaxFileSize>   
       </triggeringPolicy> 
       <layout class="ch.qos.logback.classic.PatternLayout"> 
        <Pattern>%date [%thread] %-5level %logger{80} - %msg%n</Pattern>   
       </layout> 
    </appender>  
    <appender name="a" class="ch.qos.logback.core.rolling.RollingFileAppender">
       <File>./log/mylog_a_debug.log</File>
       <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
         <FileNamePattern>./log/mylog_a_debug.%i.log</FileNamePattern>   
         <MinIndex>1</MinIndex>   
         <MaxIndex>5</MaxIndex>   
       </rollingPolicy> 
       <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy"> 
         <MaxFileSize>5MB</MaxFileSize>   
       </triggeringPolicy> 
       <layout class="ch.qos.logback.classic.PatternLayout"> 
        <Pattern>%date [%thread] %-5level %logger{80} - %msg%n</Pattern>   
       </layout> 
    </appender>
     <appender name="b" class="ch.qos.logback.core.rolling.RollingFileAppender">
       <File>./log/mylog_b_info.log</File>
       <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
         <FileNamePattern>./log/mylog_b_info.%i.log</FileNamePattern>   
         <MinIndex>1</MinIndex>   
         <MaxIndex>5</MaxIndex>   
       </rollingPolicy> 
       <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy"> 
         <MaxFileSize>5MB</MaxFileSize>   
       </triggeringPolicy> 
       <layout class="ch.qos.logback.classic.PatternLayout"> 
        <Pattern>%date [%thread] %-5level %logger{80} - %msg%n</Pattern>   
       </layout> 
    </appender>
    <appender name="c" class="ch.qos.logback.core.rolling.RollingFileAppender">
       <File>./log/mylog_c_warn.log</File>
       <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
         <FileNamePattern>./log/mylog_c_warn.%i.log</FileNamePattern>   
         <MinIndex>1</MinIndex>   
         <MaxIndex>5</MaxIndex>   
       </rollingPolicy> 
       <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy"> 
         <MaxFileSize>5MB</MaxFileSize>   
       </triggeringPolicy> 
       <layout class="ch.qos.logback.classic.PatternLayout"> 
        <Pattern>%date [%thread] %-5level %logger{80} - %msg%n</Pattern>   
       </layout> 
    </appender>
    <appender name="d" class="ch.qos.logback.core.rolling.RollingFileAppender">
       <File>./log/mylog_d_error.log</File>
       <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
         <FileNamePattern>./log/mylog_c_error.%i.log</FileNamePattern>   
         <MinIndex>1</MinIndex>   
         <MaxIndex>5</MaxIndex>   
       </rollingPolicy> 
      <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy"> 
         <MaxFileSize>5MB</MaxFileSize>   
       </triggeringPolicy> 
       <layout class="ch.qos.logback.classic.PatternLayout"> 
        <Pattern>%date [%thread] %-5level %logger{80} - %msg%n</Pattern>   
       </layout> 
    </appender>
 <logger name="com.spike.test.a" level="DEBUG"> 
     <appender-ref ref="a" />
 </logger>
 <logger name="com.spike.test.b" level="INFO"> 
     <appender-ref ref="b" />
 </logger>
 <logger name="com.spike.test.c" level="warn"> 
     <appender-ref ref="c" />
 </logger>
  <logger name="com.spike.test.d" level="error"> 
     <appender-ref ref="d" />
 </logger>
 <root> 
     <appender-ref ref="all_info" level="INFO" />
     <appender-ref ref="all_error" level="error" />   
 </root> 
 </configuration> 

下邊我們運(yùn)行下,看是否正確。
我檢查了下A,B,C,D需求很簡(jiǎn)單,都能滿足需求,分別輸出了該包下的所有DEBUG日志,info日志,warn日志,error日志。但是對(duì)于E需求問題來了,我看了下mylog_all_error.log文件內(nèi)容如下:
2009-12-27 09:33:47,156 [main] DEBUG com.spike.test.a.TestA - TestA-debug
2009-12-27 09:33:47,171 [main] INFO  com.spike.test.a.TestA - TestA-info
2009-12-27 09:33:47,171 [main] WARN  com.spike.test.a.TestA - TestA-warn
2009-12-27 09:33:47,171 [main] ERROR com.spike.test.a.TestA - TestA-error
2009-12-27 09:33:47,171 [main] INFO  com.spike.test.b.TestB - TestB-info
2009-12-27 09:33:47,171 [main] WARN  com.spike.test.b.TestB - TestB-warn
2009-12-27 09:33:47,171 [main] ERROR com.spike.test.b.TestB - TestB-error
2009-12-27 09:33:47,171 [main] WARN  com.spike.test.c.TestC - TestC-warn
2009-12-27 09:33:47,171 [main] ERROR com.spike.test.c.TestC - TestC-error
2009-12-27 09:33:47,187 [main] ERROR com.spike.test.d.TestD - TestD-error
也 就是說,<appender-ref ref="all_error" level="error" />  這個(gè)配置根本沒有效果,而且這里輸出的實(shí)際是各個(gè)子包配置結(jié)果的總和。再看看mylog_all_info.log文件,內(nèi)容也是跟 mylog_all_error.log文件內(nèi)容一樣,配置失敗。
后邊經(jīng)過反復(fù)實(shí)驗(yàn),還是達(dá)不到需求。于是在網(wǎng)上,搜索找答案,論壇發(fā)貼,在一個(gè)csdn朋友的指引下,我到http://logback.qos.ch/manual/filters.html 這個(gè)是logback的官方網(wǎng)站,里邊詳細(xì)的介紹,不看不知道,一看嚇一跳,內(nèi)容真豐富,功能真強(qiáng)大,經(jīng)過認(rèn)真研究,終于把問題解決,過程不在細(xì)說,主要 是通過logback組件的filter來解決,logback提供的filter組件很多,多種類型,而且可以自己定義,實(shí)現(xiàn)它的接口即可,功能真是強(qiáng) 大,而且可配置能力強(qiáng)。
下邊說說解決方法:
對(duì)于E配置的第一個(gè)需求,在其對(duì)應(yīng)的appender配置里增加這個(gè)子節(jié)點(diǎn):
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
          <level>INFO</level>
        </filter>
這個(gè)配置官方網(wǎng)站提供的注釋原文如下:
<!-- deny all events with a level below INFO, that is TRACE and DEBUG -->
意思是拒絕那些所有的級(jí)別在info以下用于跟蹤和調(diào)式的事件。呵呵,后邊的that is TRACE and DEBUG是一個(gè)定語從句,對(duì)a level進(jìn)行解釋。
對(duì)于E配置的第二個(gè)需求,在其對(duì)應(yīng)的appender配置里增加這個(gè)子節(jié)點(diǎn):
       <filter class="ch.qos.logback.classic.filter.LevelFilter">
          <level>ERROR</level>
          <onMatch>ACCEPT</onMatch>
          <onMismatch>DENY</onMismatch>
        </filter>
這個(gè)filter又不一樣,意思是用于日志級(jí)別過濾。
比如這里配置了level級(jí)別為ERROR, onMatch表示匹配如何處理,可以根據(jù)需求設(shè)置接受或拒絕,onMismatch表示不匹配如何處理,具體自行可以設(shè)置。
Ok,配置完成。整個(gè)logback.xml配置文件內(nèi)容如下:

<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
    <appender name="all_error" class="ch.qos.logback.core.rolling.RollingFileAppender">
       <filter class="ch.qos.logback.classic.filter.LevelFilter">
          <level>ERROR</level>
          <onMatch>ACCEPT</onMatch>
          <onMismatch>DENY</onMismatch>
        </filter>
       <File>./log/mylog_all_error.log</File>
       <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
         <FileNamePattern>./log/mylog_all_error.%i.log</FileNamePattern>   
         <MinIndex>1</MinIndex>   
         <MaxIndex>5</MaxIndex>   
       </rollingPolicy> 
       <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy"> 
         <MaxFileSize>5MB</MaxFileSize>   
       </triggeringPolicy> 
       <layout class="ch.qos.logback.classic.PatternLayout"> 
        <Pattern>%date [%thread] %-5level %logger{80} - %msg%n</Pattern>   
       </layout> 
    </appender>
    <appender name="all_info" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
          <level>INFO</level>
        </filter>
       <File>./log/mylog_all_info.log</File>
       <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
         <FileNamePattern>./log/mylog_all_info.%i.log</FileNamePattern>   
         <MinIndex>1</MinIndex>   
         <MaxIndex>5</MaxIndex>   
       </rollingPolicy> 
       <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy"> 
         <MaxFileSize>5MB</MaxFileSize>   
       </triggeringPolicy> 
       <layout class="ch.qos.logback.classic.PatternLayout"> 
        <Pattern>%date [%thread] %-5level %logger{80} - %msg%n</Pattern>   
       </layout> 
    </appender>  
    <appender name="a" class="ch.qos.logback.core.rolling.RollingFileAppender">
       <File>./log/mylog_a_debug.log</File>
       <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
         <FileNamePattern>./log/mylog_a_debug.%i.log</FileNamePattern>   
         <MinIndex>1</MinIndex>   
         <MaxIndex>5</MaxIndex>   
       </rollingPolicy> 
       <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy"> 
         <MaxFileSize>5MB</MaxFileSize>   
       </triggeringPolicy> 
       <layout class="ch.qos.logback.classic.PatternLayout"> 
        <Pattern>%date [%thread] %-5level %logger{80} - %msg%n</Pattern>   
       </layout> 
    </appender>
   
     <appender name="b" class="ch.qos.logback.core.rolling.RollingFileAppender">
       <File>./log/mylog_b_info.log</File>
       <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
         <FileNamePattern>./log/mylog_b_info.%i.log</FileNamePattern>   
         <MinIndex>1</MinIndex>   
         <MaxIndex>5</MaxIndex>   
       </rollingPolicy> 
       <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy"> 
         <MaxFileSize>5MB</MaxFileSize>   
       </triggeringPolicy> 
       <layout class="ch.qos.logback.classic.PatternLayout"> 
        <Pattern>%date [%thread] %-5level %logger{80} - %msg%n</Pattern>   
       </layout> 
    </appender>
   
   <appender name="c" class="ch.qos.logback.core.rolling.RollingFileAppender">
       <File>./log/mylog_c_warn.log</File>
       <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
         <FileNamePattern>./log/mylog_c_warn.%i.log</FileNamePattern>   
         <MinIndex>1</MinIndex>   
         <MaxIndex>5</MaxIndex>   
       </rollingPolicy> 
       <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy"> 
         <MaxFileSize>5MB</MaxFileSize>   
       </triggeringPolicy> 
       <layout class="ch.qos.logback.classic.PatternLayout"> 
        <Pattern>%date [%thread] %-5level %logger{80} - %msg%n</Pattern>   
       </layout> 
    </appender>
   
    <appender name="d" class="ch.qos.logback.core.rolling.RollingFileAppender">
       <File>./log/mylog_d_error.log</File>
       <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
         <FileNamePattern>./log/mylog_c_error.%i.log</FileNamePattern>   
         <MinIndex>1</MinIndex>   
         <MaxIndex>5</MaxIndex>   
       </rollingPolicy> 
       <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy"> 
         <MaxFileSize>5MB</MaxFileSize>   
       </triggeringPolicy> 
       <layout class="ch.qos.logback.classic.PatternLayout"> 
        <Pattern>%date [%thread] %-5level %logger{80} - %msg%n</Pattern>   
       </layout> 
    </appender>

 <logger name="com.spike.test.a" level="DEBUG"> 
     <appender-ref ref="a" />
 </logger>
 
 <logger name="com.spike.test.b" level="INFO"> 
     <appender-ref ref="b" />
 </logger>
 
 <logger name="com.spike.test.c" level="warn"> 
     <appender-ref ref="c" />
 </logger>
 
  <logger name="com.spike.test.d" level="error"> 
     <appender-ref ref="d" />
 </logger>
 <root> 
     <appender-ref ref="all_info" level="INFO" />
     <appender-ref ref="all_error" />   
 </root> 
 </configuration> 
 
運(yùn)行最后結(jié)果查看:
mylog_all_error.log文件內(nèi)容如下:
2009-12-27 09:51:40,875 [main] ERROR com.spike.test.a.TestA - TestA-error
2009-12-27 09:51:40,875 [main] ERROR com.spike.test.b.TestB - TestB-error
2009-12-27 09:51:40,890 [main] ERROR com.spike.test.c.TestC - TestC-error
2009-12-27 09:51:40,890 [main] ERROR com.spike.test.d.TestD - TestD-error
OK,全部ERROR都輸出,滿足需求。
mylog_all_info.log文件內(nèi)容如下:
2009-12-27 09:51:40,875 [main] INFO  com.spike.test.a.TestA - TestA-info
2009-12-27 09:51:40,875 [main] WARN  com.spike.test.a.TestA - TestA-warn
2009-12-27 09:51:40,875 [main] ERROR com.spike.test.a.TestA - TestA-error
2009-12-27 09:51:40,875 [main] INFO  com.spike.test.b.TestB - TestB-info
2009-12-27 09:51:40,875 [main] WARN  com.spike.test.b.TestB - TestB-warn
2009-12-27 09:51:40,875 [main] ERROR com.spike.test.b.TestB - TestB-error
2009-12-27 09:51:40,875 [main] WARN  com.spike.test.c.TestC - TestC-warn
2009-12-27 09:51:40,890 [main] ERROR com.spike.test.c.TestC - TestC-error
2009-12-27 09:51:40,890 [main] ERROR com.spike.test.d.TestD - TestD-error
Ok,不再有DEBUG級(jí)別的日志了。滿足需求。
再檢查下A,B,C,D需求,都已經(jīng)實(shí)現(xiàn)。
終于完成了,歡迎讀者朋友對(duì)文中的內(nèi)容進(jìn)行批評(píng)指正。

 

posted on 2012-08-16 02:16 大龍 閱讀(32709) 評(píng)論(4)  編輯 收藏 引用

評(píng)論

# re: 用slf4j+logback實(shí)現(xiàn)多功能日志解決方案 --- 轉(zhuǎn) 2013-03-19 17:10 網(wǎng)友

寫的非常好!  回復(fù)  更多評(píng)論   

# re: 用slf4j+logback實(shí)現(xiàn)多功能日志解決方案 --- 轉(zhuǎn)[未登錄] 2015-02-04 23:29 123

寫得非常好  回復(fù)  更多評(píng)論   

# re: 用slf4j+logback實(shí)現(xiàn)多功能日志解決方案 --- 轉(zhuǎn) 2016-01-07 15:13 Hello

寫的非常好!  回復(fù)  更多評(píng)論   

# re: 用slf4j+logback實(shí)現(xiàn)多功能日志解決方案 --- 轉(zhuǎn) 2016-06-07 15:06 welldone

謝謝樓主,整個(gè)流程非常清楚,照著做了一遍就會(huì)了。另外我分享一個(gè)logback目前尚存在的bug:當(dāng)你發(fā)現(xiàn)INFO級(jí)和ERROR級(jí)的日志沒有寫成功時(shí),上下移動(dòng)一下配置文件中appender的位置就好了。  回復(fù)  更多評(píng)論   


只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            一区二区三区不卡视频在线观看| 日韩视频免费| 夜夜嗨av一区二区三区网站四季av| 久久精品视频在线| 欧美日本视频在线| 亚洲人体1000| 欧美主播一区二区三区美女 久久精品人| 国产午夜精品福利| 久久亚洲私人国产精品va媚药| 一区二区高清视频| 国产精品国色综合久久| 午夜精品视频一区| 久久久久久97三级| 亚洲国产精品成人一区二区| 久久精品人人做人人爽电影蜜月| 国产伦精品一区二区三区四区免费| 一本色道88久久加勒比精品 | 欧美中文字幕在线观看| 狠狠色综合网| 一区二区av在线| 国产精品区一区| 亚洲自拍高清| 欧美日韩在线看| 久久不射中文字幕| 欧美喷水视频| 欧美一区二区在线免费播放| 久久综合网hezyo| 六月婷婷一区| 欧美日韩一区二区三区| 久久爱www.| 翔田千里一区二区| 香蕉视频成人在线观看| 久久久激情视频| 亚洲欧美日韩天堂一区二区| 老妇喷水一区二区三区| 午夜精品在线看| 欧美电影免费观看大全| 99精品国产在热久久下载| 欧美福利影院| 欧美成人免费网站| 欧美性做爰猛烈叫床潮| 中国女人久久久| 男人的天堂亚洲| 欧美www在线| 亚洲看片免费| 国产精品videosex极品| 中文网丁香综合网| 一区二区不卡在线视频 午夜欧美不卡在| 亚洲激情在线播放| 欧美二区在线看| 亚洲午夜电影在线观看| 国产日韩欧美精品综合| 国精品一区二区三区| 中文在线一区| 久久综合九色综合欧美狠狠| 欧美中文字幕在线观看| 韩国精品在线观看| 久久国产高清| 欧美激情网友自拍| 欧美一级大片在线观看| 亚洲毛片av在线| 欧美日韩大片| 亚洲精品日韩久久| 一区二区三区亚洲| 美日韩精品视频| 久久婷婷人人澡人人喊人人爽| 亚洲毛片av| 性欧美1819sex性高清| 国产一区二区无遮挡| 一区二区精品在线观看| 亚洲日本中文字幕| 亚洲影院免费观看| 亚洲国产精品一区二区www| 久久精品国产久精国产思思| 亚洲精选在线观看| 一区二区欧美激情| 欧美日韩一区二区欧美激情| 欧美1区2区视频| 国产欧美日韩视频在线观看| 欧美日韩精品综合在线| 亚洲免费一级电影| 免费日韩成人| 亚洲大胆av| 亚洲免费在线| 夜夜狂射影院欧美极品| 久久久免费精品视频| 久久久久久久精| 国产欧美一级| 久久久欧美精品| 久久精品亚洲精品国产欧美kt∨| 国产精品蜜臀在线观看| 亚洲精选在线| 性视频1819p久久| 国产亚洲精品成人av久久ww| 欧美亚洲日本一区| 欧美激情久久久久久| 在线亚洲欧美专区二区| 国产欧美精品日韩区二区麻豆天美| 一区二区欧美视频| 久热综合在线亚洲精品| 亚洲国产精品第一区二区| 欧美日韩一区综合| 亚洲一区二区三区乱码aⅴ| 午夜久久影院| 亚洲伦理精品| 欧美三级日本三级少妇99| 性欧美长视频| 一本色道久久综合| 欧美成人tv| 久久男人av资源网站| 夜夜爽www精品| 黑人中文字幕一区二区三区| 欧美激情第六页| 蜜桃av噜噜一区| 欧美影院视频| 亚洲欧美另类在线| 久久久欧美精品sm网站| 欧美日韩成人在线视频| 国产精品一区免费在线观看| 精品1区2区| 黄色成人免费观看| 亚洲视频在线观看视频| 欧美日韩亚洲三区| 国产日本精品| 一区二区三区精品视频| 欧美成人视屏| 久久国产精品久久久久久久久久| 麻豆精品精华液| 中国亚洲黄色| 欧美一区二区黄| 免费观看日韩av| 亚洲精品视频中文字幕| 国产精品家庭影院| 国内精品久久久久久影视8 | 久久激情综合网| 久久精品国产99精品国产亚洲性色| 亚洲精品中文字幕在线| 亚洲欧美日韩精品久久久久| 久久久精品动漫| 91久久精品日日躁夜夜躁欧美| 亚洲国产精品一区二区尤物区| 一本色道久久综合精品竹菊 | 久久国产精品亚洲77777| 久久成人国产| 欧美三级视频在线观看| 一区二区亚洲精品国产| 亚洲欧美激情四射在线日 | 久久九九精品| 亚洲毛片播放| 亚洲区一区二| 在线观看91精品国产麻豆| 老巨人导航500精品| 亚洲成人在线视频播放| 日韩视频精品| 亚洲国产专区| 国产日韩亚洲| 欧美色道久久88综合亚洲精品| 欧美一区影院| 国产精品99久久久久久人| 亚洲精品一区二区三区不| 亚洲成色777777女色窝| 欧美顶级艳妇交换群宴| 蜜桃av一区| 日韩视频一区二区在线观看| 亚洲最新视频在线| 亚洲男人的天堂在线aⅴ视频| 久久综合伊人77777蜜臀| 黄网站免费久久| 亚洲精品乱码久久久久久蜜桃麻豆| 欧美在线首页| 在线 亚洲欧美在线综合一区| 亚洲美女视频在线观看| 亚洲免费网站| 亚洲激情偷拍| 美女精品在线| 国产综合激情| 性色av一区二区怡红| 尤物yw午夜国产精品视频明星| 亚洲自拍另类| 亚洲一区二区三区精品视频| 国产精品久久久久久久久婷婷 | 免费91麻豆精品国产自产在线观看| 91久久精品日日躁夜夜躁欧美| 亚洲自拍高清| 久久精品国产亚洲高清剧情介绍| 国产精品jizz在线观看美国| 一本色道久久综合精品竹菊 | 国产欧美在线视频| 久久综合色影院| 国模私拍一区二区三区| 久久精品国产亚洲一区二区| 午夜在线观看欧美| 亚洲丰满少妇videoshd| 亚洲精选在线观看| 久久网站免费| 99在线精品视频在线观看| 亚洲一区二区成人| 亚洲精品少妇30p| 亚洲一区二区精品| 欧美日韩不卡视频|