简单了解 SLF4J LOG4J Logback logging 日志框架

Posted 菜鸟日常

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了简单了解 SLF4J LOG4J Logback logging 日志框架相关的知识,希望对你有一定的参考价值。

题图是我准备从百度上找图片素材得到的结果,我只想说 简单了解 SLF4J LOG4J Logback logging 日志框架


1. 介绍


在群里看到别人分享的一个面试题,常用的日志框架有哪些?他们有什么区别和联系?


看到这个问题的刹那,我??? 脑子一片空白,平时只是拿来用用,并没有当回事,现在才知道不懂的是真的很多,每天多学点基础知识,加油!


2. 日志框架


SLF4J(Simple Logging Facade for Java),定义了各种日志框架(java.util.logging, logback, log4j 等)的抽象,是 Java 日志输出的标准接口。需引入 slf4j-api-xxx.jar


Simple,SLF4J 的简单实现,需引入 slf4j-simple-xxx.jar


java.util.logging,jdk 自带的日志工具类,它通过 getLogger 获取日志对象、setLevel 定义日志级别、Handler 定义日志输出方式 (输出到文件、控制台、网络流)、Formatter 定义日志输出样式。需引入 slf4j-jdk14-xxx.jar


Logback,官网表示它可作为 log4j 的 successor(继承者),比 log4j 更好!它包括 3 个模块:

  • logback-core,下面两个模块的基础依赖

  • logback-classic,对 log4j 进行了显著地改进,实现了 SLF4J API,方便随时切换日志框架。

  • logback-access,与 Servlet 容器(Tomcat、Jetty)进行集成,提供 HTTP 访问日志功能。


log4j 2.X,Apache 表示它是 log4j 的升级版,并且优化了 logback 的一些缺点,比 logback 提供更多的功能,我觉得它们可以打一架看谁更好,需引入 slf4j-log4j12-xxx.jar


NOP,A direct NOP (no operation) implementation of Logger,具体干嘛不清楚。需引入 slf4j-nop-xxx.jar


JCL(Jakarta Commons Logging),又叫 Apache Commons Logging,和 SLF4J 类似,提供日志框架抽象,方便开发者使用不同的日志实现类框架。


他们之间的联系就是:使用 slf4j 定义日志输出模板,然后使用具体的日志框架(java.util.logging, logback, log4j等)定义日志具体输出的形式。


3. 使用


首先引入 slf4j-api-xxx.jar 包,通过 Logger 与 LoggerFactory 输出日志,这样日志输出的模板就定义好了,两行代码即可输出相应的日志。

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

public class HelloWorld {
 public static void main(String[] args) {
   Logger logger = LoggerFactory.getLogger(HelloWorld.class);
   logger.info("Hello World");
 }
}


但是仅仅引入 slf4j-api 的 jar 包还不行,控制台会提示没有绑定具体日志框架实现,设置打印日志的地方也不会打印出日志。

SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.


还需要引入绑定  slf4j 的日志框架,定义日志输出的具体形式,具体的日志输出形式通过相应的配置文件进行,常用的日志实现框架有以下几种:


slf4j 自带的 slf4j-simple-xxx.jar

<dependency> 
 <groupId>ch.qos.logback</groupId>
 <artifactId>logback-classic</artifactId>
 <version>1.0.13</version>
</dependency>


logback

<dependency> 
 <groupId>org.slf4j</groupId>
 <artifactId>slf4j-log4j12</artifactId>          
 <version>1.8.0-beta2</version>
</dependency>


log4j

<dependency> 
 <groupId>org.slf4j</groupId>
 <artifactId>slf4j-log4j12</artifactId>
 <version>1.8.0-beta2</version>
</dependency>


java.util.logging

<dependency> 
 <groupId>org.slf4j</groupId>
 <artifactId>slf4j-jdk14</artifactId>
 <version>1.8.0-beta2</version>
</dependency>


也就是说,引入 slf4j-api ,系统就具备了打印日志的能力,但日志怎样形式打印,还需要按需引入相应的日志实现框架包,才能实现日志打印。


4. SLF4J 使用注意事项


1. 不绑定具体的日志框架


若程序只加入了 slf4j-api 依赖,而没有设置具体的日志框架,那么 SLF4J 会发出警告,并且忽略所有的日志打印请求


2. 版本兼容


slf4j-api 不同版本是互相兼容的,不同系统之间的 slf4j-api 版本不同并不会造成冲突;但是其实现类是可能存在冲突的,例如使用 slf4j-api-1.0.jar 和 slf4j-simple-1.0.jar 是没有问题的,但是使用 slf4j-simple-2.0.jar 可能存在问题。在引入相关依赖的时候,要保证 slf4j-api 的版本和其实现日志框架的版本一致!


3. 格式输出


slf4j 支持占位符输出

logger.debug("Temperature set to {}. Old temperature was {}.", t, oldT);



博客参考

SLF4J和Logback和Log4j和Logging的区别与联系

https://blog.csdn.net/qq_32625839/article/details/80893550



5. 总结


SLF4J 是个日志抽象框架,定义基本的日志输出功能,必须引入。SLF4J 可以与其它的日志框架相结合,输出自己想要的日志格式。


看文档是个不错的选择,英文刚开始看可能有些浮躁,静下心来慢慢看,结合翻译一定能看出点东西


看了几篇博客和文档,算是有了一个大概,内心感觉踏实了一点,至少知道自己在做什么,最坏的情况的就是不知道自己不知道,还在那里悠然自乐。


下次再学习下 log4j 在 Spring 中的配置。



推荐阅读:





菜鸟日常


以上是关于简单了解 SLF4J LOG4J Logback logging 日志框架的主要内容,如果未能解决你的问题,请参考以下文章

Log4j,Log4j2,Logback,Slf4J日志框架你真的了解吗?阿里巴巴Java开发手册为什么强制推荐使用Slf4j?

从 log4j 迁移到 logback

常用日志框架(Log4j,Slf4j,Logback)之间到底有啥区别

LogBack入门实践

slf4j的介绍

logback最佳实践