slf4j是通用的接口规范,log4j是具体实现的日志插件,slf4j也可以搭配其他实现的jar包一起使用。
本文参考3W学习方法来叙述内容。
log4j:log for java,Apache的一个开源项目,可以通过一个配置文件灵活配置日志的输送目的地、记录级别、输出格式。
slf4j:simple log facade for java,译为简单日志门面。官方介绍为,SLF4J作为各种日志系统的简单Facade或抽象,允许最终用户在部署时插入所需的日志框架。
总结:slf4j是通用的接口规范,log4j是具体实现的日志插件。
PS:代码中命名常用【4 代表 for】、【2 代表 to】
在知晓了slf4j是一套接口、log4j是一套具体实现后,就需要理解编程中“接口”的意义(统一规范、解耦、提高编程灵活性和可维护性)。
同理,在实现不同项目开发中“日志记录”的过程中,引入一套通用的日志接口规范后,既能兼容不同项目中使用的不同日志实现插件,又能在后期维护中随时更换其他的日志实现插件。
日志实现插件可以根据需要更换Logback或其他。日志接口规范还有Commons Logging,而slf4j的出现主要因为对前者的不满意,所以slf4j是对Commons Logging的改进。这里改进主要看一点:支持带占位符的字符串。
例如:
String me = "zhangsan";
String you = "lisi";
// Commons Logging 打印日志
log.info("Hello, " + you + ". I'm " + me + ".");
// slf4j 打印日志
log.info("Hello, {}. I'm {}.", you, me);
maven坐标为:
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.13</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.13</version>
</dependency>
在需要打印日志的Java Bean 中,定义属性成员:
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
...
...
private static final Logger logger = LoggerFactory.getLogger(getClass());
...
...
logger.info("Hello, world.")
PS: 日志对象在类的实例中一般不需要修改和多份对象,所以常用static和final修饰。
常用组合方式为:
1. Slf4j + Logback
2. Slf4j + Log4j
3. Commons Logging + Log4j
PS: Logback更适合搭配Slf4j,不建议搭配Commons Logging, 因为Logback与Slf4j为同一作者,兼容性更好。