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

            大龍的博客

            常用鏈接

            統(tǒng)計

            最新評論

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

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

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

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

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

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

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

             

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

            評論

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

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

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

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

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

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

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

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


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


            久久青青草原精品国产软件| 久久久精品人妻一区二区三区蜜桃| 亚洲天堂久久精品| 亚洲国产成人精品91久久久| 精品久久久久久综合日本| 2021国内精品久久久久久影院| 精品无码久久久久久久动漫| 四虎国产精品免费久久久| 1000部精品久久久久久久久| 国产色综合久久无码有码| 亚洲国产成人久久综合一区77| 久久人妻少妇嫩草AV蜜桃| 久久久久亚洲av无码专区喷水| 无码人妻久久一区二区三区蜜桃 | 国产香蕉97碰碰久久人人| 中文字幕无码久久人妻| 一级做a爰片久久毛片16| 囯产精品久久久久久久久蜜桃| 久久www免费人成看国产片| 久久综合给合久久狠狠狠97色69| 97久久国产露脸精品国产 | 囯产精品久久久久久久久蜜桃| 精品久久久久久国产免费了| 99久久99这里只有免费的精品| 久久精品国产男包| 亚洲国产天堂久久综合| 色综合久久综合网观看| 99国产精品久久| 久久久久99精品成人片直播| 色偷偷偷久久伊人大杳蕉| 久久精品国产乱子伦| 色婷婷噜噜久久国产精品12p| AA级片免费看视频久久| 久久免费香蕉视频| 久久精品视屏| 久久免费的精品国产V∧| 久久伊人五月丁香狠狠色| 亚洲另类欧美综合久久图片区| 久久久久18| 久久只这里是精品66| 久久精品无码一区二区无码|