首页 > 代码库 > 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