1、出现的原因:log4j,slf4j结合使用时,这里说下slf4j的一点原理:它是facade模式设计的,简单的说它只是个门面,具体做事的还是被他包装起来的(如:apache common logging,log4j,jdklogging等),所以在搭建项目是如果想使用slf4j那你必须还得选择一个干活的工具,也就是对应的配置文件,这里我选者Log4j,相应的配置文件是log4j.properties.
2、为什么出错了:我在搭建工程的时候放了log4j-1.2.16.jar、slf4j-api-1.5.11.jar、slf4j-simple-1.5.11.jar,使用的配置文件是log4j.properties,用:
- PropertyConfigurator.configure("conf/log4j.properties");
PropertyConfigurator.configure("conf/log4j.properties");
加载了日志配置,在spring中打出的日志和log4j.properties指定的格式相同,但是我在自己的程序中输出日志时显示的格式和指定的不同,应为没有琢磨透,所以很晕,无解,后来单独建立个工程找出了问题所在。其实很简单:
slf4j-simple-1.5.11.jar就是Jdk Logging相关的jar,而Jdk logging系统默认有一个配置文件,在JAVA_HOME中,而JDk logging加载配置文件的时候有个优先顺序(自己去查),所以出现了日志输出不同的问题。
选择JDK自带的日志系统,则只需要将slf4j-api-1.5.10.jar和slf4j-jdk14-1.5.10.jar放置到classpath中即可,如果中途无法忍受JDK自带的日志系统了,想换成log4j的日志系统,仅需要用slf4j-log4j12-1.5.10.jar替换slf4j-jdk14-1.5.10.jar即可
应用举例
- package chb.test.slf4j;
- import org.slf4j.Logger;
- import org.slf4j.LoggerFactory;
- /**
- * @author chb
- *
- */
- public class TestSlf4j {
- Logger log = LoggerFactory.getLogger(TestSlf4j.class);
- public void testLog(){
- log.info("this is a test log");
- }
- /**
- * @param args
- */
- public static void main(String[] args) {
- TestSlf4j slf = new TestSlf4j();
- slf.testLog();
- }
- }
- 2010-1-5 21:44:47 chb.test.slf4j.TestSlf4j testLog
- 信息: this is a test log
- 0 [main] INFO chb.test.slf4j.TestSlf4j - this is a test log
- log4j.debug=true
- log4j.rootLogger=DEBUG,stdout
- log4j.appender.stdout=org.apache.log4j.ConsoleAppender
- log4j.appender.stdout.Target=System.out
- log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
- log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p - %m%n
- public static void main(String[] args) {
- System.setProperty("log4j.configuration", "log4j.properties");
- TestSlf4j slf = new TestSlf4j();
- slf.testLog();
- }
- log4j: Parsing for [root] with value=[DEBUG,stdout].
- log4j: Level token is [DEBUG].
- log4j: Category root set to DEBUG
- log4j: Parsing appender named "stdout".
- log4j: Parsing layout options for "stdout".
- log4j: Setting property [conversionPattern] to [%d{ABSOLUTE} %5p - %m%n ].
- log4j: End of parsing for "stdout".
- log4j: Setting property [target] to [System.out].
- log4j: Parsed "stdout" options.
- log4j: Finished configuring.
- 22:01:40,831 INFO - this is a test log
- LoggerFactory通过StaticLoggerBinder.getSingleton().getLoggerFactory()获得LogFactory,然后再通过该LogFactory来获取logger的
- 但是StaticLoggerBinder类并不在slf4j-api-1.5.10.jar中,分析与具体日志系统相关的jar包,会发现每个jar包都有一个StaticLoggerBinder类的实现(如slf4j-log4j12-1.5.10.jar、slf4j-simple-1.5.10.jar、slf4j-jdk14-1.5.10.jar均有StaticLoggerBinder类实现),这就很明白了,slf4j在启动时会动态到classpath中查找StaticLoggerBinder类,找到之后就可以生成对应日志系统的日志文件了。