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需求,都已经实现。
终于完成了,欢迎读者朋友对文中的内容进行批评指正。

logback:用slf4j+logback实现多功能日志解决方案的更多相关文章

  1. 用slf4j+logback实现多功能日志解决方案 --- 转

    大家都知道,slf4j是原来log4j的作者写的一个新的日志组件,意思是简单日志门面接口,可以跟其他日志组件配合使用,常用的配合是slf4j+logback,无论从功能上还是从性能上都较之log4j有 ...

  2. 在云环境上使用SLF4J对Java程序进行日志记录

    我开发了一个Java应用,部署到云环境上之后,用postman测试发现不能按照我期望的工作,但是返回的消息对我没有任何帮助. 因为部署在云端的应用很难像本地Java应用一样调试,所以我打算用SLF4J ...

  3. Java日志框架 (commons-logging,log4j,slf4j,logback)

    转自:http://blog.csdn.net/kobejayandy/article/details/17335407 如果对于commons-loging.log4j.slf4j.LogBack等 ...

  4. 使用 SLF4J + LogBack 构建日志系统(转)

    转载自:http://www.cnblogs.com/mailingfeng/p/3499436.html 上次我们讨论了如何选择一个好的开源日志系统方案,其中的结论是:使用 SLF4J + LogB ...

  5. slf4j+logback搭建超实用的日志管理模块

    文章转自http://www.2cto.com/kf/201702/536097.html slf4j+logback搭建超实用的日志管理模块(对日志有编号管理):日志功能在服务器端再常见不过了,我们 ...

  6. 用SLF4j/Logback打印日志-1

    在 浅谈后端日志系统 中已经写了很多日志方面的零散的非技术的东西.本篇更像一份入门说明,讲解一下SLF4j/Logback.SLF4J是一套抽象的日志API接口,logback它是的底层实现,所以在这 ...

  7. 【Java】日志知识总结和经常使用组合配置(commons-logging,log4j,slf4j,logback)

    Log4j Apache的一个开放源码项目,通过使用Log4j,我们能够控制日志信息输送的目的地是控制台.文件.GUI组件.甚至是套接口服务 器.NT的事件记录器.UNIX Syslog守护进程等.用 ...

  8. 日志框架之2 slf4j+logback实现日志架构 · 远观钱途

    如何从缤纷复杂的日志系统世界筛选出适合自己的日志框架以及slf4j+logback的组合美妙之处?此文可能有帮助 logback介绍 Logback是由log4j创始人设计的另一个开源日志组件,官方网 ...

  9. SpringBoot(三) - Slf4j+logback 日志,异步请求,定时任务

    1.Slf4j+logback 日志 SpringBoot框架的默认日志实现:slf4j + logback: 默认日志级别:info,对应了实际生产环境日志级别: 1.1 日志级别 # 常见的日志框 ...

随机推荐

  1. KMP算法&next数组总结

    http://www.cnblogs.com/yjiyjige/p/3263858.html KMP算法应该是每一本<数据结构>书都会讲的,算是知名度最高的算法之一了,但很可惜,我大二那年 ...

  2. XP和win7的软件崩溃提示

    运行在XP上的应用软件崩溃时总提示:应用程序错误,xxxxx地址不能写... 现在win7上提示的就只有关闭和调试程序,没有这些详细信息.其实win7下面也记录了相关的信息. 位置在:“控制面板” - ...

  3. MarkdownPad2的密钥

    MarkdownPad2的密钥 经本人试用 邮箱: Soar360@live.com 授权秘钥: GBPduHjWfJU1mZqcPM3BikjYKF6xKhlKIys3i1MU2eJHqWGImDH ...

  4. Spring与Quartz的整合实现定时任务调度(转)

    最近在研究Spring中的定时任务功能,最好的办法当然是使用Quartz来实现.对于一个新手来说,花了我不少时间,这里我写个笔记,给大家参考.我使用的是Maven来管理项目,需要的Jar包我给大家贴出 ...

  5. postman进行http接口测试

    HTTP的接口测试工具有很多,可以进行http请求的方式也有很多,但是可以直接拿来就用,而且功能还支持的不错的,我使用过的来讲,还是postman比较上手. 优点: 1.支持用例管理 2.支持get. ...

  6. 【Tomcat】Invalid character found in the request target

    Invalid character found in the request target. The valid characters are defined in RFC 7230 and RFC ...

  7. 7.21.06 java内存模型

    资料来源:http://www.cnblogs.com/smile361/archive/2013/11/25/3441553.html 程序计数器: 当前线程所执行的字节码的行号指示器 本地方法栈: ...

  8. 报表 jasper + ireport5.6

    下载 iReport-5.6.0,jdk7,以及众多lib , 这里我提供下资源(我的百度云) 安装好iReport-5.6.0和jdk7,  在安装目录的\etc\ireport.conf,修改其中 ...

  9. java面向对象(三)之抽象类,接口,向上转型

    java类 java类分为普通类和抽象类,接口,上一节我大概讲了java类的一般格式,今天将抽象类和接口.同时讲一下它们是怎样存储的. 最重要的是理解为什么要有抽象和接口,这样学下来你猜不会迷茫,才能 ...

  10. Spring中的线程池和定时任务功能

    1.功能介绍 Spring框架提供了线程池和定时任务执行的抽象接口:TaskExecutor和TaskScheduler来支持异步执行任务和定时执行任务功能.同时使用框架自己定义的抽象接口来屏蔽掉底层 ...