log4j 以及 logback, slf4j 官网

日志框架的困惑

作为一个正常的项目,是必须有日志框架的存在的,没有日志,很难追踪一些奇奇怪怪的系统问题。

但是,我们经常在项目的依赖中,见到奇奇怪怪 slf4j-api,slf4j-log4j12,log4j-over-slf4j,log4j,log4j-core,logback,这些这么多,每次配置日志要导入这些包。

难免有些疑惑,为啥导入这么多依赖,有时候按照习惯导入的依赖,引入之后日志框架报错,多重绑定等等问题。

以及,配置文件有log4j.xml ,有log4j2.xml,有logging.properties,有logback.xml,log4j.properties,完全不知道怎么对应。

例如一个经常见到的,多重SLF4j绑定的错误,在SpringBoot项目中报错是无法启动的。

SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/C:/project/org.slf4j/slf4j-log4j12/1.7.10/xxx/slf4j-log4j12-1.7.10.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/C:/project/ch.qos.logback/logback-classic/1.1.2/xxx/logback-classic-1.1.2.jar!/org/slf4j/impl/StaticLoggerBinder.class]

jul

JUL就是 JDK的LOG,(java.util.logging or JUL for short),这个就是JDK原生的了,仅仅满足最基本最原始的日志需求。

SLF4j

slf4j只是一个日志标准,并不是日志系统的具体实现。理解这句话非常重要,slf4j只做两件事情:

提供日志接口

提供获取具体日志对象的方法

slf4j-simple、logback都是slf4j的具体实现,log4j并不直接实现slf4j,但是有专门的一层桥接slf4j-log4j12来实现slf4j。

也就是说,我们可以推定,现在的稍微新一点的系统中一般都会有slf4j-api,看名字就知道这个依赖是少不了的。我们不用担心他导致冲突。

log4j

log4j是一个用Java编写的可靠,快速和灵活的日志框架(API),它在Apache软件许可下发布。

Log4j已经被移植到了C,C++,C#,Perl,Python和Ruby等语言中。

Log4j是高度可配置的,并可通过在运行时的外部文件配置。它根据记录的优先级别,并提供机制,以指示记录信息到许多的目的地,诸如:数据库,文件,控制台,UNIX系统日志等。

Log4j中有三个主要组成部分:loggers: 负责捕获记录信息。appenders : 负责发布日志信息,以不同的首选目的地。layouts: 负责格式化不同风格的日志信息。

logback

logback 是log4j创始人写的,性能比log4j要好,是目前最好,最推荐使用的框架,目前主要分为3个模块

logback-core:核心代码模块

logback-classic:log4j的一个改良版本,同时实现了slf4j的接口,这样你如果之后要切换其他日志组件也是一件很容易的事

logback-access:访问模块与Servlet容器集成提供通过Http来访问日志的功能。

这里就不介绍 logback 为什么能取代log4j了

jcl

JCL,全称为"Jakarta Commons Logging",也可称为"Apache Commons Logging"。

JCL这个日志框架跟Log4J,Java Logging API等日志框架不同。

JCL采用了设计模式中的“适配器模式”,它对外提供统一的接口,然后在适配类中将对日志的操作委托给具体的日志框架,比如Log4J,Java Logging API等。

可见,他是和 slf4j 差不多的,但是需要适配的。

SLF4j 的转换关系以及工作原理

这里也不做过多介绍,看这个官网的图,一目了然

另外,桥接适配的图:

这里做一下简短的说明,

slf4j-log4j12 是用log4j实现的slf4j,会强制将SLF4j的请求转发为log4j的实现,配置文件对应log4j.xml。

log4j-over-slf4j 是桥接所有log4j的API,转向 SLF4j的实现。如果这两者同时出现,则导致互相调用导致无限循环。他的作用是解决 logback和log4j共存的问题,有些依赖框架使用了log4j,这可以使得框架的日志能够被转发到logback中。

The presence of slf4j-log4j12.jar, that is the log4j binding for SLF4J, will force all SLF4J calls to be delegated to log4j. The presence of log4j-over-slf4j.jar will in turn delegate all log4j API calls to their SLF4J equivalents. If both are present simultaneously, slf4j calls will be delegated to log4j, and log4j calls redirected to SLF4j, resulting in an endless loop.

同理,jul-over-slf4j,jcl-over-slf4j,都是这个作用,将jul 以及 jcl 适配到 slf4j的实现类中。(通常是 logback,over 的含义就是 the underlying,jcl 门面,底层实现为slf4j的实现 )

log4j , log4j-core, logback的配置文件对应关系

log4j 这个一般是 1.x的也就是 对应配置文件为 log4j.xml

log4j-core 这个是 2.x 的log4j,因为log4j已经过时。而他对应 log4j2.xml

slf4j-log4j12 这个实际上对应 log4j 1.2,他的配置文件是 log4j.xml

logback-classic和logback-core 就是 logback.xml

注意 log4j的配置文件语法,和 log4j2,以及logback这三者的语法均不相同。

相关的语法,不建议在博客中复制,直接查看apache log4j ,以及 qos.ch 官网(包含 slf4j ,log4j,logback)的配置文件示例。

理由如下:

log4j的配置文件:

appender里面的是 level,而root里面是priority。很多博客给出的是错误的。

拨云见日,彻底弄清楚Java日志框架 log4j, logback, slf4j的区别与联系的更多相关文章

  1. Java日志框架:logback详解

    为什么使用logback 记得前几年工作的时候,公司使用的日志框架还是log4j,大约从16年中到现在,不管是我参与的别人已经搭建好的项目还是我自己主导的项目,日志框架基本都换成了logback,总结 ...

  2. 【转】Java日志框架:logback详解

    为什么使用logback 记得前几年工作的时候,公司使用的日志框架还是log4j,大约从16年中到现在,不管是我参与的别人已经搭建好的项目还是我自己主导的项目,日志框架基本都换成了logback,总结 ...

  3. java日志框架log4j详细配置及与slf4j联合使用教程

    最后更新于2017年02月09日 一.log4j基本用法 首先,配置log4j的jar,maven工程配置以下依赖,非maven工程从maven仓库下载jar添加到“build path” <d ...

  4. [转载]java日志框架log4j详细配置及与slf4j联合使用教程

    一.log4j基本用法 首先,配置log4j的jar,maven工程配置以下依赖,非maven工程从maven仓库下载jar添加到“build path” 1 2 3 4 5 <dependen ...

  5. java日志框架log4j详细配置及与slf4j使用教程

    一.log4j基本用法 首先,配置log4j的jar,maven工程配置以下依赖,非maven工程从maven仓库下载jar添加到“build path” 1 2 3 4 5 <dependen ...

  6. Java日志框架(Commons-logging,SLF4j,Log4j,Logback)

    简介 在系统开发中,日志是很重要的一个环节,日志写得好对于我们开发调试,线上问题追踪等都有很大的帮助.但记日志并不是简单的输出信息,需要考虑很多问题,比如日志输出的速度,日志输出对于系统内存,CPU的 ...

  7. Java 日志框架概述(slf4j / log4j / JUL / Common-logging(JCL) / logback)

    一.简介 JAVA日志在初期可能官方并没有提供很好且实用的规范,导致各公司或OSS作者选择自行造轮子,这也导致了目前初学者觉得市面上 Java 日志库繁杂的局面. 现在市面流行以 slf4j(Simp ...

  8. java日志框架之logback(一)——logback工程简介

    Logback工程 致力于成为log4j工程的继承者 Logback的架构足够泛型化,故能够应用于许多不同的环境.当前,logback划分为三个组件: logback-core logback-cla ...

  9. Java程序员最常用的8个Java日志框架

    转自:http://www.codeceo.com/article/8-java-log-framework.html 作为一名Java程序员,我们开发了很多Java应用程序,包括桌面应用.WEB应用 ...

随机推荐

  1. 记一个复杂组件(Filter)的从设计到开发

    此文前端框架使用 rax,全篇代码暂未开源(待开源) 原文链接地址:Nealyang/PersonalBlog 前言 貌似在面试中,你如果设计一个 react/vue 组件,貌似已经是司空见惯的问题了 ...

  2. C# 时间戳的相关操作

    一般的 时间戳 格式分为两种 即 10位(秒)时间戳 与 13位(毫秒)时间戳 时间戳 类型也分为两种 即 本地时间戳 与 世界统一(UTC)时间戳 废话不多说,直接上代码: 一.时间戳获取方法 // ...

  3. Mybatis的xml文件对大于号小于号的特殊处理!

    当我们需要通过xml格式处理sql语句时,经常会用到< ,<=,>,>=等符号,但是很容易引起xml格式的错误,这样会导致后台将xml字符串转换为xml文档时报错,从而导致程序 ...

  4. python beautiful soup

    官方文档:https://www.crummy.com/software/BeautifulSoup/bs4/doc.zh/ 使用前需要先安装模块,并安装解析器 pip install beautif ...

  5. golang 你所不知道的 log 和 fmt

    直接点说,就是由于fmt 是线程不安全的, 如果你在多协程场景下使用fmt打印信息可能会得到乱序的结果 就是说 不按代码里的顺序打印. 下面看示例 代码示例 golang fmt 多线程 乱序: fu ...

  6. 基于SpringBoot+WebSocket搭建一个简单的多人聊天系统

    前言   今天闲来无事,就来了解一下WebSocket协议.来简单了解一下吧. WebSocket是什么   首先了解一下WebSocket是什么?WebSocket是一种在单个TCP连接上进行全双工 ...

  7. 快学Scala 第十九课 (trait的abstract override使用)

    trait的abstract override使用: 当我看到abstract override介绍的时候也是一脸懵逼,因为快学scala,只介绍了因为TimestampLogger中调用的super ...

  8. QQ第三方授权登录OAuth2.0实现(Java)

    准备材料 1.已经备案好的域名 2.服务器(域名和服务器为统一主体或域名已接入服务器) 3.QQ号 4.开发流程:https://wiki.connect.qq.com/%E5%87%86%E5%A4 ...

  9. 痞子衡嵌入式:飞思卡尔i.MX RTyyyy系列MCU硬件那些事(2.1)- 玩转板载OpenSDA,Freelink调试器

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是飞思卡尔i.MX RTyyyy系列EVK上板载调试器的用法. 本文是i.MXRT硬件那些事系列第二篇,第一篇痞子衡给大家整体介绍了i.M ...

  10. Rust入坑指南:坑主驾到

    欢迎大家和我一起入坑Rust,以后我就是坑主,我主要负责在前面挖坑,各位可以在上面看,有手痒的也可以和我一起挖.这个坑到底有多深?我也不知道,我是抱着有多深就挖多深的心态来的,下面我先跳了,各位请随意 ...