首页 > 代码库 > slf4j

slf4j

一、slf4j简介

SLF4J,即简单日志门面(Simple Logging Facade for Java),不是具体的日志解决方案,它只服务于各种各样的日志系统。
按照官方的说法,SLF4J是一个用于日志系统的简单Facade,允许最终用户在部署其应用时使用其所希望的日志系统。
实际上,SLF4J所提供的核心API是一些接口以及一个LoggerFactory的工厂类。从某种程度上,SLF4J有点类似JDBC,不过比JDBC更简单,在JDBC中,你需要指定驱动程序,而在使用SLF4J的时候,不需要在代码中或配置文件中指定你打算使用那个具体的日志系统。如同使用JDBC基本不用考虑具体数据库一样,SLF4J提供了统一的记录日志的接口,只要按照其提供的方法记录即可,最终日志的格式、记录级别、输出方式等通过具体日志系统的配置来实现,因此可以在应用中灵活切换日志系统。

二、示例

(1) slf4j接口和自身的实现类

package com.wbf.log;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * slf4j-api-1.5.8.jar和slf4j-simple-1.5.8.jar(如果是slf4j-nop-1.5.8.jar,控制台没有信息输出)
 * @author wbf
 */
public class TestSlf4jSimple {
	private final Logger logger = LoggerFactory.getLogger(TestSlf4jSimple.class);
	
	public static void main(String[] args) {
		TestSlf4jSimple testSlf4j = new TestSlf4jSimple();
		testSlf4j.testLog(10);
	}
	
	private void testLog(int a) {
		if (a == 10) {
			logger.info("log info...");
			logger.warn("log warn...");
			logger.error("log error...");
		}
	}
}

运行结果:

1 [main] INFO com.wbf.log.TestSlf4jSimple - log info...
1 [main] WARN com.wbf.log.TestSlf4jSimple - log warn...
1 [main] ERROR com.wbf.log.TestSlf4jSimple - log error...

(3) slf4j接口和JDK日志实现类

package com.wbf.log;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * slf4j-api-1.5.8.jar和slf4j-jdk14-1.5.8.jar
 * @author wbf
 */
public class TestSlf4jJDK {
	private final Logger logger = LoggerFactory.getLogger(TestSlf4jJDK.class);
	
	public static void main(String[] args) {
		TestSlf4jJDK testSlf4j = new TestSlf4jJDK();
		testSlf4j.testLog(10);
	}
	
	private void testLog(int a) {
		if (a == 10) {
			logger.info("log info...");
			logger.warn("log warn...");
			logger.error("log error...");
		}
	}
}

运行结果:

2015-1-28 14:59:46 com.wbf.log.TestSlf4jJDK testLog
信息: log info...
2015-1-28 14:59:46 com.wbf.log.TestSlf4jJDK testLog
警告: log warn...
2015-1-28 14:59:46 com.wbf.log.TestSlf4jJDK testLog
严重: log error...

 

(2) slf4j接口和log4j实现类

package com.wbf.log;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * slf4j-api-1.5.8.jar、slf4j-log4j12-1.5.8.jar、log4j-1.2.15.jar和log4j.properties
 * debug<info<warn<error
 * log4j.rootLogger=级别,如:warn,但是warn之下的级别debug, info的信息无法输出
 * @author wbf
 */
public class TestSlf4jLog4j {
	private final Logger logger = LoggerFactory.getLogger(TestSlf4jLog4j.class);
	
	public static void main(String[] args) {
		TestSlf4jLog4j testSlf4j = new TestSlf4jLog4j();
		testSlf4j.testLog(10);
	}
	
	private void testLog(int a) {
		if (a == 10) {
			logger.info("log info...");
			logger.warn("log warn...");
			logger.error("log error...");
		}
	}
}

log4j.properties

### direct log messages to 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 %c{1}:%L - %m%n

log4j.rootLogger=warn, stdout

运行结果:

14:34:51,700  WARN TestSlf4jLog4j:23 - log warn...
14:34:51,702 ERROR TestSlf4jLog4j:24 - log error...

解释说明:

日志信息级别(由小到大debug<info<warn<error)

log4j.rootLogger=warn,设置了日志信息的输出级别。当前被设置为warn,则级别比warn低(即info, debug)的日志信息无法输出,级别比warn高的可以。

 

三、注意问题

(1) 当往path里添加jar包时,不可以有多个日志的实现jar包,如:slf4j-simple-1.5.8.jar和log4j-1.2.15.jar,会起冲突。

虽然这是会选择log4j-1.2.15.jar,但是执行时会有如下信息输出:

SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/E:/%e8%b5%84%e6%96%99/hibernate+slf4j+junit+mysql-conn/slf4j-1.5.8/slf4j-log4j12-1.5.8.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/E:/%e8%b5%84%e6%96%99/hibernate+slf4j+junit+mysql-conn/slf4j-1.5.8/slf4j-simple-1.5.8.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
14:41:56,870  WARN TestSlf4jLog4j:23 - log warn...
14:41:56,872 ERROR TestSlf4jLog4j:24 - log error...

(2) 面向接口编程

例子1:private final Logger logger = LoggerFactory.getLogger(TestSlf4jSimple.class);

例子2:private final Logger logger = LoggerFactory.getLogger(TestSlf4jJDK.class);

例子3:private final Logger logger = LoggerFactory.getLogger(TestSlf4jLog4j.class);

其中

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

不管是slf4j自身的简单日志实现,或JDK的日志实现,还是使用log4j的日志实现,在记录日志的过程中,使用的始终是slf4j-api-1.5.8.jar中提供的接口Logger和类LoggerFactory,而不是日志实现jar包中的类或接口。这也更加体现了slf4j的意义。在以后的开发中,统一使用slf4j,用户喜欢哪种日志的实现就配置即可,代码几乎不用改动。

slf4j