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. python unittest+parameterized,单元测试框架+参数化

    总要写新的自动化测试模块,在这里把demo记录下来,后面方便自己直接复制粘贴 from nose_parameterized import parameterized import unittest ...

  2. Java的EOF标识?

     这篇是关于JAVA中EOF标识的讲解,之前在工作上碰到过一个问题,有人问过,不能通过判断EOF来知道文件有没有读取完毕吗?其实,还真不能.  直接从JDK接口文档入手,以FileInputStrea ...

  3. 读《深入理解Elasticsearch》点滴-查询评分

    计算文档得分的因子: 文档权重(document boost):索引期赋予某个文档的权重值 字段权重(field boost):查询期赋予某个文档的权重值 协调因子(coord):基于文档中词项个数的 ...

  4. idea 环境变量设置编码

    1.打开Run/Debug Configuration,选择你的tomcat 2.然后在  Server > VM options 设置为 -Dfile.encoding=UTF-8

  5. SUSE CaaS Platform 4 - 安装部署

    SUSE CaaS Platform 相关文章 (1)SUSE CaaS Platform 4 - 简介 (2)SUSE CaaS Platform 4 - 安装部署 (3)SUSE CaaS Pla ...

  6. iOS开发进阶(唐巧)读书笔记(一)

    如何提高iOS开发技能 1.阅读博客:https://github.com/tangqiaoboy/iOSBlogCN 40多位iOS开发博主的博客地址 2.读书:每年阅读一本高质量的iOS开发书籍 ...

  7. [scrapy-redis] install and configure scrapy-redis on CentOS 7 (1)

    0. 安装依赖 yum install -y zlib zlib-devel openssl openssl-devel bzip2 bzip2-devel sqlite-devel gcc wget ...

  8. 为了给女朋友买件心怡内衣,我用Python爬虫了天猫内衣售卖数据

    真爱,请置顶或星标 大家好,希望各位能怀着正直.严谨.专业的心态观看这篇文章.ヾ(๑╹◡╹)ノ" 接下来我们尝试用 Python 抓取天猫内衣销售数据,并分析得到中国女性普遍的罩杯数据.最受 ...

  9. 不依赖远程API启动SEER区块链命令行钱包和网页钱包的方法

    不依赖远程API启动命令行钱包和网页钱包的方法 在SEER的见证人操作等需要使用命令行钱包的操作中,我们介绍了通过钱包连接远程API来和区块链交互的方法.类似这样: cli_wallet.exe -s ...

  10. Mac安装Command Line Tools

    从App Store上下载的Xcode,默认是不会安装Command Line Tools的,Command Line Tools是在Xcode中的一款工具,可以在命令行中运行C程序. 在终端中输入命 ...