zoukankan      html  css  js  c++  java
  • logback:用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需求,都已经实现。
    终于完成了,欢迎读者朋友对文中的内容进行批评指正。

  • 相关阅读:
    DB2 java.lang.NoClassDefFoundError:com/ibm/db2/jcc/SQLJContext
    JavaScript字符串split方法
    使用 WebSphere Application Server Community
    为DB2数据库创建新用户帐户并为其分配特定特权
    Servlet3.0之一:Servlet3.0新特性介绍
    window下jni调用dll和linux下jni调用so库(转)
    分表分库之三:中间件介绍
    jboss5 启动时报HsqlException:length must be specified in type definition:VARBINARY错误
    J2EE Formbased Authentication
    阻塞队列之七:DelayQueue延时队列
  • 原文地址:https://www.cnblogs.com/dengyungao/p/7525285.html
Copyright © 2011-2022 走看看