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

大龍的博客

常用鏈接

統計

最新評論

用slf4j+logback實現多功能日志解決方案 --- 轉

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

一 準備相關工具
1.  從網上下載slf4j組件和logback相關的jar包,很多網站都有,logback可以直接到這個網站下載http://logback.qos.ch/http://www.slf4j.org/可以直接到這里下載http://www.slf4j.org/。總之,不管在哪里下載,你都需要找到以下幾個jar包(可能根據需要,有個別不需要,這個沒有詳細研究,讀者可以自己研究下):
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. 準備測試環境:
1)建立一個JAVA工程,比如是LogTest,工程整體目錄結構如下(csdn的博客發圖很不方便,也許我不會 用,暫時描述下吧),工程根目錄除了src目錄外,新建一個lib目錄,將上邊4個jar包放入并導入工程。再新建一個config目錄,用于存放日志配 置文件logback.xml,這個文件如何配置,后邊再介紹。
2)建立測試類以及相關包:
包結構以及包類的文件如下:
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類的測試代碼如下,其他4個類代碼類似:
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");
         }
}

目的很簡單,就是在構造函數中打印各種級別的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個文件就不再此列出,大家應該想得到,
啟動類Start.java內容如下:
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文件,但文件內容沒有介紹,下邊說說:
先介紹最簡單的一個配置,如配置文件內容如下:
<?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級別的日志全部記錄到這個日志文件./log /mylog_a_debug.log中。一個appender代表一個具體的日志配置項目,可以通過name屬性的名字在logger節點中通過 appender-ref引用。具體不細說。
下邊運行下配置結果,看是否跟我們想的一致。
運行前,先要配置個啟動參數,,否則日志直接到控制臺了,在ECLIPSE啟動參數里加入如下代碼:
-Dlogback.configurationFile=./config/logback.xml
這個主要是告訴系統日志配置文件放在哪里。
啟動程序運行!
然后到跟/log/目錄下,我們會看到有一個新的文件mylog_a_debug.log,打開看到內容如下:
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
正好實現我們的簡單需求。

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

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

然后增加all_info對應的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>  
2)  E配置的第2個需求:記錄所有的error級別的日志,也就是不記錄debug,info,warn級別日志,單獨一個日志文件,可以看到整個系統的所有error級別日志記錄。且該配置不受A,B,C,D,E其他配置的任何影響,我們參考第一個需求配置如下:
<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,全部配置完了,整個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> 

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

<?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> 
 
運行最后結果查看:
mylog_all_error.log文件內容如下:
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文件內容如下:
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級別的日志了。滿足需求。
再檢查下A,B,C,D需求,都已經實現。
終于完成了,歡迎讀者朋友對文中的內容進行批評指正。

 

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

評論

# re: 用slf4j+logback實現多功能日志解決方案 --- 轉 2013-03-19 17:10 網友

寫的非常好!  回復  更多評論   

# re: 用slf4j+logback實現多功能日志解決方案 --- 轉[未登錄] 2015-02-04 23:29 123

寫得非常好  回復  更多評論   

# re: 用slf4j+logback實現多功能日志解決方案 --- 轉 2016-01-07 15:13 Hello

寫的非常好!  回復  更多評論   

# re: 用slf4j+logback實現多功能日志解決方案 --- 轉 2016-06-07 15:06 welldone

謝謝樓主,整個流程非常清楚,照著做了一遍就會了。另外我分享一個logback目前尚存在的bug:當你發現INFO級和ERROR級的日志沒有寫成功時,上下移動一下配置文件中appender的位置就好了。  回復  更多評論   


只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   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>
            久久gogo国模啪啪人体图| 国产精品99一区| 亚洲第一在线综合网站| 久久精品免费观看| 久久久噜噜噜久久狠狠50岁| 久久精品导航| 久久久久久久综合| 欧美成人精品在线播放| 亚洲国产精彩中文乱码av在线播放| 久久综合网络一区二区| 欧美激情性爽国产精品17p| 亚洲国产裸拍裸体视频在线观看乱了中文 | 国产麻豆日韩| 一区二区三区中文在线观看 | 久久高清一区| 亚洲国产精品va| 亚洲午夜三级在线| 久久噜噜噜精品国产亚洲综合| 欧美激情影院| 久久亚洲欧美国产精品乐播| 亚洲国内自拍| 国产精品久久久久久久午夜| 狠狠综合久久av一区二区小说 | 亚洲国产精品女人久久久| 99在线热播精品免费| 欧美一区二区三区婷婷月色| 亚洲高清免费视频| 亚洲一区二区三区国产| 欧美成人精品在线播放| 国产欧美一区二区三区在线老狼| 亚洲欧洲精品一区| 久久精品天堂| 一区二区免费在线观看| 久热爱精品视频线路一| 国产女主播视频一区二区| 亚洲激情av| 久久午夜羞羞影院免费观看| 亚洲视频视频在线| 欧美多人爱爱视频网站| 狠狠色伊人亚洲综合成人| 亚洲永久网站| 亚洲欧洲一二三| 久久综合激情| 国内成+人亚洲+欧美+综合在线| 亚洲午夜电影网| 亚洲国产精品精华液2区45| 欧美一区二区黄| 国产精品亚洲一区| 亚洲午夜伦理| 亚洲欧洲一区二区在线播放| 久久久久久久网站| 国语自产精品视频在线看8查询8| 欧美一级理论性理论a| 中文日韩在线| 欧美色综合天天久久综合精品| 亚洲国产精品一区二区www| 免费观看不卡av| 久久亚洲国产精品日日av夜夜| 国产日韩亚洲欧美精品| 欧美在线地址| 欧美一区二区三区成人| 韩国福利一区| 亚洲高清视频的网址| 欧美www在线| 一本久道久久综合婷婷鲸鱼 | 久久精品五月婷婷| 国精产品99永久一区一区| 久久九九全国免费精品观看| 久久成人综合视频| 亚洲国产mv| 亚洲精品一区在线| 国产精品久久久久久久久久直播| 午夜精品视频| 久久久久这里只有精品| 亚洲免费观看高清在线观看| 亚洲精品一区久久久久久| 欧美一站二站| 日韩视频一区二区在线观看| 欧美一级久久久| 欧美尤物一区| 最新精品在线| 亚洲一区二区三区四区视频| 国产一二精品视频| 亚洲国产精品第一区二区| 欧美视频精品在线| 久久久久88色偷偷免费| 免费在线看成人av| 午夜国产精品视频免费体验区| 欧美一区二区三区播放老司机 | 亚洲综合第一| 久久精品青青大伊人av| 日韩视频一区二区三区| 午夜久久美女| 日韩一级黄色片| 校园春色国产精品| 一区二区三区四区国产精品| 欧美一二三区精品| 夜夜嗨av一区二区三区网页| 欧美亚洲免费| 亚洲午夜久久久久久尤物 | 蜜桃av一区| 欧美午夜精品久久久久久孕妇 | 亚洲一区制服诱惑| 美女性感视频久久久| 性色av一区二区三区红粉影视| 久久手机精品视频| 欧美一区二区三区在线看| 欧美激情导航| 欧美a级在线| 国产亚洲欧美色| 亚洲香蕉伊综合在人在线视看| 亚洲激情二区| 久久久久久亚洲精品不卡4k岛国| 亚洲男女毛片无遮挡| 欧美精品在线观看| 欧美国产三级| 一区在线免费观看| 午夜亚洲性色视频| 亚洲欧美成人网| 欧美日韩岛国| 亚洲人久久久| 亚洲黄色高清| 久久综合99re88久久爱| 久久视频在线视频| 国产亚洲精久久久久久| 在线中文字幕一区| 亚洲伊人色欲综合网| 欧美激情一区二区三区蜜桃视频| 另类尿喷潮videofree| 国产乱码精品一区二区三| 亚洲色图在线视频| 亚洲一区二区三区在线播放| 欧美日韩午夜视频在线观看| 亚洲人成网站色ww在线| 日韩视频国产视频| 欧美激情综合色综合啪啪| 亚洲高清色综合| 一区二区三区毛片| 99精品国产热久久91蜜凸| 亚洲日本国产| 欧美大尺度在线观看| 亚洲国产精品久久| 日韩视频中文字幕| 欧美三级中文字幕在线观看| 日韩午夜在线| 午夜在线成人av| 国产日产欧美一区| 久久精品论坛| 亚洲精品久久久久| 亚洲欧美激情视频| 国产日韩精品综合网站| 久久亚洲精品一区二区| 欧美国产精品专区| aa成人免费视频| 国产精品久久久久av免费| 亚洲欧美综合精品久久成人| 久久精品国产2020观看福利| 精品1区2区| 欧美精品日韩综合在线| 一区二区三区精品视频| 久久成人18免费观看| 亚洲国产mv| 国产精品久久久久7777婷婷| 久久国产免费| 99国产精品自拍| 久久男女视频| aaa亚洲精品一二三区| 国产日韩欧美一区二区| 免费亚洲电影在线观看| 亚洲丝袜av一区| 欧美成人午夜剧场免费观看| 亚洲香蕉成视频在线观看| 韩国女主播一区二区三区| 欧美日韩亚洲国产一区| 久久久久久九九九九| 中文一区二区在线观看| 免费视频一区二区三区在线观看| 亚洲天堂成人在线观看| 在线国产精品一区| 国产精品久久久久久久久久直播| 美女国产精品| 欧美一区二区三区在线| 一区二区三区日韩欧美| 欧美激情视频在线免费观看 欧美视频免费一 | 欧美亚洲一区三区| 亚洲精品一区二区在线| 老司机久久99久久精品播放免费 | 激情婷婷亚洲| 国产精品永久| 欧美日韩精品免费观看视一区二区 | 欧美fxxxxxx另类| 欧美一区二区三区播放老司机| 亚洲精品资源| 在线看片欧美| 欧美粗暴jizz性欧美20| 国产精品夜夜夜| 久久久中精品2020中文| av成人毛片| 亚洲黄页一区| 欧美黄色片免费观看|