slf4j只是一个门面(facet),它不包含具体的实现,而是将一些log4j,java.logging等实现包装成统一的接口。借用下图展示了常用日志文件的关系:
通过上面的图,可以简单的理清关系!
commons-logging和slf4j都是日志的接口,供用户使用,而没有提供实现!
log4j,logback等等才是日志的真正实现。
当我们调用接口时,接口的工厂会自动寻找恰当的实现,返回一个实现的实例给我服务。这些过程都是透明化的,用户不需要进行任何操作!
这里有个小故事,当年Apache说服 log4j以及其他的日志来按照commons-logging的标准编写,但是由于commons-logging的类加载有点问题,实现起来也不友 好,因此log4j的作者就创作了slf4j,也因此而与commons-logging两分天下。至于到底使用哪个,由用户来决定吧。
这样,slf4j出现了,它通过简单的实现就能找到符合自己接口的实现类,如果不是满足自己标准的日志,可以通过一些中间实现比如上面的slf4j-log4j12.jar来进行适配。
好,言归正传,如何使用slf4j?
一、使用slf4j快速入门
2、准备log4j.properties文件
slf4j自带的一个简单实现,可用于小项目中,但无法配置日志级别等。
官方文档中的描述为:Binding for Simple implementation, which outputs all events to System.err. Only messages of level INFO and higher are printed. This binding may be useful in the context of small applications.
在项目的build_path中加入slf4j-1.6.6.jar与slf4j-simple-1.6.6.jar。
输出结果如下:
2 [main] ERROR Slf4jDemo - Error Message!
2 [main] WARN Slf4jDemo - Warn Message!
2 [main] INFO Slf4jDemo - Info Message!
(二)slf4j-jdk
使用jkd自带的日志系统,在项目的build_path中加入slf4j-1.6.6.jar与slf4j-jdk14-1.6.6.jar。
输出结果如下:
二月 16, 2015 11:09:36 下午 Slf4jDemo main
严重: Error Message!
二月 16, 2015 11:09:36 下午 Slf4jDemo main
警告: Warn Message!
二月 16, 2015 11:09:36 下午 Slf4jDemo main
信息: Info Message!
(三)slf4j-log4j
log4j是目前用得最多的日志系统,它更适用于大型项目。
在项目的build_path中加入slf4j-1.6.6.jar与slf4j-log4j-1.6.6.jar,以及log4j的具体实现,如log4j-1.2.16.jar。
输出结果如下:log4j需要log4j.properties文件,因此下面的输出是有误的
log4j:WARN No appenders could be found for logger (Slf4jDemo).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
可以通过配置文件配置输出日志的级别。
三、一些注意事项
1、注意build_path中不能有多个日志实现,否则会导致slf4j不知道该使用哪个实现,从而出现以下错误
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/Users/liaoliuqing/99_Project/1_myCodes/5_JavaEEDemo/lib/slf4j-log4j12-1.6.6.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/Users/liaoliuqing/99_Project/1_myCodes/5_JavaEEDemo/lib/slf4j-jdk14-1.6.6.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.slf4j.impl.Log4jLoggerFactory]
log4j:WARN No appenders could be found for logger (Slf4jDemo).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
2、log4j的配置请见???
通过上面的图,可以简单的理清关系!
commons-logging和slf4j都是日志的接口,供用户使用,而没有提供实现!
log4j,logback等等才是日志的真正实现。
当我们调用接口时,接口的工厂会自动寻找恰当的实现,返回一个实现的实例给我服务。这些过程都是透明化的,用户不需要进行任何操作!
这里有个小故事,当年Apache说服 log4j以及其他的日志来按照commons-logging的标准编写,但是由于commons-logging的类加载有点问题,实现起来也不友 好,因此log4j的作者就创作了slf4j,也因此而与commons-logging两分天下。至于到底使用哪个,由用户来决定吧。
这样,slf4j出现了,它通过简单的实现就能找到符合自己接口的实现类,如果不是满足自己标准的日志,可以通过一些中间实现比如上面的slf4j-log4j12.jar来进行适配。
好,言归正传,如何使用slf4j?
一、使用slf4j快速入门
1、pom.xml设置
首先,项目中必须要包括slf4j-api.jar,此外,还应该包括slf4j为具体实现所提供的适配器(如slf4j-log4j12.jar),以及那个具体实现的jar包(如log4j-1.**.jar)。
在pom.xml中增加以下内容:
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.0</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.0</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
2、准备log4j.properties文件
默认情况下,log4j从项目代码目录的config/log4j.properties读取配置参数,因此先创建此文件,然后将config目录build_path --->user as source folder即可。
当然,也可以手工指定log4j.properties文件的位置,文件内容如下:
### set log levels ###
log4j.rootLogger = debug , stdout , D , E
### 输出到控制台 ###
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 %c{1}:%L - %m%n
### 输出到日志文件 ###
log4j.appender.D = org.apache.log4j.DailyRollingFileAppender
log4j.appender.D.File = logs/log.log
log4j.appender.D.Append = true
## 输出DEBUG级别以上的日志
log4j.appender.D.Threshold = DEBUG
log4j.appender.D.layout = org.apache.log4j.PatternLayout
log4j.appender.D.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] %m%n
### 保存异常信息到单独文件 ###
log4j.appender.E = org.apache.log4j.DailyRollingFileAppender
## 异常日志文件名
log4j.appender.E.File = ./error.log
log4j.appender.E.Append = true
## 只输出ERROR级别以上的日志!!!
log4j.appender.E.Threshold = ERROR
log4j.appender.E.layout = org.apache.log4j.PatternLayout
log4j.appender.E.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [ %l:%c:%t:%r ] - [ %p ] %m%n
详细的配置请参考网上资料。
package org.lujinhong.javademo.slf4jdemo;
import java.io.File;
import java.io.IOException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* @author jinhong-lu
* @date 2015年7月9日 下午4:34:49
* @Description:
*/
public class Slf4jDemo {
private static final Logger LOG = LoggerFactory.getLogger(Slf4jDemo.class);
public static void main(String[] args) {
// 使用此变量会生成文件成功
String fileName = "1.txt";
// 使用此变量会生成文件失败
// String fileName = "/tt/1.txt";
try {
new File(fileName).createNewFile();
LOG.info("create file " + fileName + "!");
} catch (IOException e) {
e.printStackTrace();
LOG.error("create file " + fileName + " fail!!!!" + e.getMessage());
}
}
}
二、常见的日志实现系统
由于所使用的具体实现不同,日志输出也有不同的结果。这也反应了通过使用slf4j,使得可以方便的替换日志系统。
(一)Slf4j-simple
slf4j自带的一个简单实现,可用于小项目中,但无法配置日志级别等。
官方文档中的描述为:Binding for Simple implementation, which outputs all events to System.err. Only messages of level INFO and higher are printed. This binding may be useful in the context of small applications.
在项目的build_path中加入slf4j-1.6.6.jar与slf4j-simple-1.6.6.jar。
输出结果如下:
2 [main] ERROR Slf4jDemo - Error Message!
2 [main] WARN Slf4jDemo - Warn Message!
2 [main] INFO Slf4jDemo - Info Message!
(二)slf4j-jdk
使用jkd自带的日志系统,在项目的build_path中加入slf4j-1.6.6.jar与slf4j-jdk14-1.6.6.jar。
输出结果如下:
二月 16, 2015 11:09:36 下午 Slf4jDemo main
严重: Error Message!
二月 16, 2015 11:09:36 下午 Slf4jDemo main
警告: Warn Message!
二月 16, 2015 11:09:36 下午 Slf4jDemo main
信息: Info Message!
(三)slf4j-log4j
log4j是目前用得最多的日志系统,它更适用于大型项目。
在项目的build_path中加入slf4j-1.6.6.jar与slf4j-log4j-1.6.6.jar,以及log4j的具体实现,如log4j-1.2.16.jar。
输出结果如下:log4j需要log4j.properties文件,因此下面的输出是有误的
log4j:WARN No appenders could be found for logger (Slf4jDemo).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
可以通过配置文件配置输出日志的级别。
三、一些注意事项
1、注意build_path中不能有多个日志实现,否则会导致slf4j不知道该使用哪个实现,从而出现以下错误
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/Users/liaoliuqing/99_Project/1_myCodes/5_JavaEEDemo/lib/slf4j-log4j12-1.6.6.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/Users/liaoliuqing/99_Project/1_myCodes/5_JavaEEDemo/lib/slf4j-jdk14-1.6.6.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.slf4j.impl.Log4jLoggerFactory]
log4j:WARN No appenders could be found for logger (Slf4jDemo).
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
2、log4j的配置请见???