由于java日志框架众多(common-logging,log4j,slf4j,logback等),引入jar包的时候,就要为其添加对应的日志实现。。

不同的jar包,可能用了不同的日志框架,那引用了之后就得给不同的日志框架添加配置,这个是比较麻烦的。

slf4j就是为了解决这个麻烦事的。

slf4j全称为Simple Logging Facade for JAVA,java简单日志门面。类似于Apache Common-Logging,是对不同日志框架提供的一个门面封装,可以在部署的时候不修改任何配置即可接入一种日志实现方案。但是,他在编译时静态绑定真正的Log库。使用SLF4J时,如果你需要使用某一种日志实现,那么你必须选择正确的SLF4J的jar包的集合(各种桥接包)。

这个东西要用图才能说得清楚,借用官网一张图:

 
image.png

下载了slf4j的压缩包后,这里下的版本是slf4j-1.7.25.zip,里面有很多jar文件。

slf4j的核心包是slf4j-api-1.7.25.jar,需要配合日志实现,才能将日志绑定另一种输出。我们先看看slf4j里的jar包的作用.

jcl-over-slf4j.jar  -->    (jcl    -> slf4j)    将Jakarta Commons Logging日志框架到 slf4j 的桥接
jul-to-slf4j.jar --> (juc -> slf4j) 将java.util.logging的日志桥接到 slf4j
log4j-over-slf4j.jar--> (log4j -> slf4j) 将log4j 的日志,桥接到slf4j
osgi-over-slf4j.jar --> (osgi -> slf4j) 将osgi环境下的日志,桥接到slf4j
slf4j-android.jar --> (android-> slf4j) 将android环境下的日志,桥接到slf4j
slf4j-api.jar --> slf4j 的api接口jar包
slf4j-ext.jar --> 扩展功能
slf4j-jcl.jar --> (lf4j -> jcl ) slf4j 转接到 Jakarta Commons Logging日志输出框架
slf4j-jdk14.jar --> (slf4j -> jul ) slf4j 转接到 java.util.logging,所以这个包不能和jul-to-slf4j.jar同时用,否则会死循环!!
slf4j-log4j12.jar --> (slf4j -> log4j) slf4j 转接到 log4j,所以这个包不能和log4j-over-slf4j.jar同时用,否则会死循环!!
slf4j-migrator.jar --> 一个GUI工具,支持将项目代码中 JCL,log4j,java.util.logging的日志API转换为slf4j的写法
slf4j-nop.jar --> (slf4j -> null) slf4j的空接口输出绑定,丢弃所有日志输出
slf4j-simple.jar --> (slf4j -> slf4j-simple ) slf4j的自带的简单日志输出接口

这样整理之后,slf4j的jar包用途就比较清晰了。
目前个人遇到的项目里,一般还会有log4j和log4j2混用的问题。
因为log4j项目已经停止更新了,官方建议用log4j2。
然后,log4j2里也提供了对各类log的桥接支持,这里就只列举相关的几个jar包说明。

log4j-1.2-api.jar   -->    (log4j  -> log4j2)               将log4j 的日志转接到log4j2日志框架
log4j-api.jar --> log4j2的api接口jar包
log4j-core.jar --> ( log4j2 -> log4j-core) log4j2的日志输出核心jar包
log4j-slf4j-impl.jar--> (slf4j -> log4j2) slf4j 转接到 log4j2 的日志输出框架 (不能和 log4j-to-slf4j同时用)
log4j-to-slf4j.jar --> ( log4j2 -> slf4j) 将 log4j2的日志桥接到 slf4j (不能和 log4j-slf4j-impl 同时用)

从这里就已经可以看到,日志框架之间的关系有点乱。
因为log4j2和slf4j都能对接多种日志框架,所以这些包的依赖,作用,还有命名,都容易让人混淆。

这里针对 log4j, log4j2, slf4j做一个简单总结。

log4j

这个最简单,单独使用jar包就一个,已经停止更新,当前最新版是 log4j-1.2.17.jar
只有输出功能,没有转接功能。
可以用

//    PropertyConfigurator.configure("conf/log4j.properties");
// DOMConfigurator.configure("conf/log4j.xml");

来指定配置文件位置。

log4j2

同时有日志输出和转接功能。
单独使用时,jar包是 log4j-api-2.x.x.jar 和 log4j-core-2.x.x.jar
如果配置文件不在src目录,或者项目build Path 的source目录下,可以用以下代码指定配置文件位置:

String config = System.getProperty("user.dir");// 获取程序的当前路径
ConfigurationSource source = new ConfigurationSource(
new FileInputStream(config + File.separator + "conf" + File.separator + "log4j2.xml"));
Configurator.initialize(null, source); // 以下代码是log4j已经加载配置的情况下,指定加载其他的配置
LoggerContext logContext = (LoggerContext) LogManager.getContext(false);
File conFile = new File("conf/logs/log4j2.xml");
logContext.setConfigLocation(conFile.toURI());
logContext.reconfigure();

log4j -> log4j2 桥接

去掉 log4j 1.x jar,添加log4j-1.2-api.jar,配合 log4j-api-2.x.x.jar 和 log4j-core-2.x.x.jar 即可,依赖如下

log4j-1.2-api.jar
log4j-api-2.x.x.jar
log4j-core-2.x.x.jar

log4j2 -> log4j 桥接

不建议。
本来log4j在2015年停止更新后,就建议转向log4j2,并提供了到log4j2的桥接接口。
所以反过来log4j2到log4j是不建议这么做的,log4j2也没有提供直接支持。
但理清了上面的jar包作用,就会发现,可以通过 log4j2 -> slf4j -> log4j 的方式来实现。

需要的jar包,根据依赖关系分别是:

log4j-api-2.x.x.jar
log4j-to-slf4j.jar
slf4j-api-x.x.x.jar
slf4j-log4j12-x.x.x.jar
log4j-1.2.17.jar

slf4j

同时有日志输出和转接功能。
核心jar包是 slf4j-api-x.x.x.jar
因为一般slf4j 只作为桥接用,如果要搭配 slf4j 自带的简单日志输出,那么就加上 slf4j-simple.jar

log4j -> slf4j

将代码中的log4j日志桥接到 slf4j,需要如下jar包

log4j-over-slf4j-x.x.x.jar
slf4j-api-x.x.x.jar

log4j2 -> slf4j

将代码中的log4j2日志桥接到 slf4j,需要如下jar包

log4j-api-2.x.x.jar
log4j-to-slf4j-2.x.x.jar
slf4j-api-x.x.x.jar

slf4j -> log4j

将slf4j日志,采用log4j实现进行输出,需要如下jar包

slf4j-api-x.x.x.jar
slf4j-log4j12.jar
log4j-1.2.17.jar

slf4j -> log4j2

将slf4j日志,采用log4j2实现进行输出,需要如下jar包

slf4j-api-x.x.x.jar
log4j-slf4j-impl.jar
log4j-api.jar
log4j-core.jar

slf4j的代理绑定和输出组合起来,就实现了从一种日志框架,转到另一种日志实现框架的效果。
建议在这三种日志混用的情况下,采用如下方案

log4j -> log4j2
slf4j -> log4j2

作者:懒癌正患者
链接:https://www.jianshu.com/p/d7b0e981868d
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

关于slf4j log4j log4j2的jar包配合使用的那些事的更多相关文章

  1. 常见java日志系统的搭配详解:关于slf4j log4j log4j2 logback jul jcl commons-logging jdk-logging

    先看一张图: 是不是有点晕, 晕就对了.这个仅仅是 slf4j 的情况,实际上, 我们不仅要接触到 slf4j ,有时候还会接触其他的日志系统.且看下文分解. 1 直接使用各个日志系统 1.1 直接使 ...

  2. Log4j2升级jar包冲突问题

    升级Log4j2后日志提示jar包冲突: SLF4J: Class path contains multiple SLF4J bindings.SLF4J: Found binding in [jar ...

  3. 面试题:应用中很多jar包,比如spring、mybatis、redis等等,各自用的日志系统各异,怎么用slf4j统一输出?(上)

    一.问题概述 如题所说,后端应用(非spring boot项目)通常用到了很多jar包,比如spring系列.mybatis.hibernate.各类连接数据库的客户端的jar包.可能这个jar包用的 ...

  4. java传统web项目添加maven管理jar包,log4j无法正常输出日志

    本文适合1年以上编程基础的开发人员阅读,非技术创新,可作为故障排除实录参考/收藏. 背景 笔者最近在给公司一个老的web项目改造升级,项目使用springmvc+mybatis,由于项目比较久远,没有 ...

  5. Log4j,Log4j2,logback,slf4j日志学习

    日志学习笔记 Log4j Log4j是Apache的一个开放源代码项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台.文件.数据库等:我们也可以控制每一条日志的输出格式:通过定义每一条 ...

  6. Log4j,Log4j2,logback,slf4j日志学习(转)

    日志学习笔记Log4jLog4j是Apache的一个开放源代码项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台.文件.数据库等:我们也可以控制每一条日志的输出格式:通过定义每一条日志 ...

  7. 【maven】排除maven中jar包依赖的解决过程 例子:spring cloud启动zipkin,报错maven依赖jar包冲突 Class path contains multiple SLF4J bindings.

    一直对于maven中解决jar包依赖问题的解决方法纠结不清: 下面这个例子可以说明一个很简单的解决方法: 项目启动报错: Connected to the target VM, address: '1 ...

  8. spring cloud启动zipkin,报错maven依赖jar包冲突 Class path contains multiple SLF4J bindings

    项目启动报错: Connected to the target VM, address: '127.0.0.1:59412', transport: 'socket' SLF4J: Class pat ...

  9. Ant-编译构建(2)-第3方jar包引入、log4j2

    1.项目目录结构图,lib包引入了一些关于common logging+log4j2相关的jar. 2.编写相关的build.xml <?xml version="1.0" ...

随机推荐

  1. 深度剖析Kubernetes API Server三部曲 - part 1

    欢迎来到深入学习Kubernetes API Server的系列文章,在本系列文章中我们将深入的探究Kubernetes API Server的相关实现.如果你对Kubernetes 的内部实现机制比 ...

  2. (九)Hibernate 的复合主键

    一.什么是复合主键? 一张表的主键是由多个字段组成,这个主键就被称为复合主键.  主键是唯一确定某条记录的字段,比如公民的身份证号就是一个主键,因为由身份证号这个主键就可以确定 某个公民.   有一种 ...

  3. 加密算法 MD5 和 SHA 的 JAVA 实现

    首先先简单的介绍一下MD5 和 SHA 算法 然后看一下在  java.security.MessageDigest   (信息摘要包下) 如何分别实现  md5 加密 和 sha 加密 最后在看一下 ...

  4. ES 6 日期util.js =>

    微信小程序demo const formatTime = date => { const year = date.getFullYear() const month = date.getMont ...

  5. ASP.NET WEB应用程序(.network4.5)MVC Razor视图引擎2

    https://www.bbsmax.com/A/gAJG67OXzZ/ 在MVC3.0版本的时候,微软终于引入了第二种模板引擎:Razor.在这之前,我们一直在使用WebForm时代沿留下来的ASP ...

  6. Linux学习笔记:cut命令

    基础 功能:文件内容查看,显示行中指定部分,删除文件中指定字段.cut 命令用于显示每行从开头算起 a - b 的文字. 语法: cut [-bn] [file.txt] cut [-c] [file ...

  7. JavaScript-- 基础知识面试题

    1.JavaScript语言特点 1.弱类型,数据类型由数据的值决定 2.解释性脚本语言--解释器是JS引擎 是浏览器的一部分 3.运行在客户端浏览器上 4.有事件驱动机制(按下鼠标,移动窗口等) 5 ...

  8. CSS3实现瀑布流布局

    讲干货,不啰嗦,瀑布流布局是种常见的布局方式,常用于图片相关的样式展示,通过CSS3的多列(Multi-column)属性,可以简单的实现类似效果. 具体步骤: 1.设置外部容器多列列数(column ...

  9. 3 webpack 4 加vue 2.0生产环境搭建

    1 在前两篇笔记中已经能把开发环境弄好了,接来下构建他的生产环境 2 使用npm 安装url-loader和file-loader来支持图片和字体 npm install --save-dev url ...

  10. ASE —— 第一次结对作业

    问题定义 游戏规则: N个玩家,每人写一个或两个0~100之间的有理数 (不包括0或100),提交给服务器,服务器在当前回合结束时算出所有数字的平均值,然后乘以0.618,得到G值. 提交的数字最靠近 ...