日志用来记录应用的运行状态以及一些关键业务信息,其重要性不言而喻,通常我们借助于现有的日志框架完成日志输出。目前开源的日志框架很多,常见的有log4j、logback等,有时候我们还会碰到诸如common-logging、slf4j这些名词,这些框架有什么作用?它们之间有什么联系?在搭建应用时该如何选择合适的日志框架?对于这些问题,将会在本文中做出解释。

一、日志门面与日志组件

        在上面提到的log4j、logback、common-logging、slf4j中,包含了2类框架,其中一类是具体用来输出日志的框架,log4j和logback属于此类,我们将他们称为“日志组件”;另两个common-logging、slf4j被归为“日志门面”,或叫做“日志接口”。
        简单来说,可以按照面向接口编程的思想来理解这2种组件,“日志门面”提供了标准的日志输出API,其底层如何实现,或者说采用什么日志组件,由开发者进行选择。当然,选择的日志组件必须实现了对应“日志门面”的接口。

1.1.log4j与logback

        log4j隶属于apache,其包含一个升级产品(log4j2),是目前流行的日志组件之一。logback则是近些年来才开始流行,由于其在性能上PK掉了log4j,因此越来越多的项目开始使用logback。另外JAVA的官方类库也提供了日志组件,即JAVA UTIL LOGGING(下文简称JUL),这里我们不做重点讨论。
        下面直接引用一段话来表述log4j和logback的性能差距:
某些关键操作,比如判定是否记录一条日志语句的操作,其性能得到了显著的提高。这个操作在LogBack中需要3纳秒,而在Log4J中则需要30纳秒。 
LogBack创建记录器(logger)的速度也更快:13微秒,而在Log4J中需要23微秒。更重要的是,它获取已存在的记录器只需94纳秒,而 Log4J需要2234纳秒,时间减少到了1/23。跟JUL相比的性能提高也是显著的。
另外,LOGBack的所有文档是全面免费提供的,不象Log4J那样只提供部分免费文档而需要用户去购买付费文档。

1.2.common-logging与slf4j

        前文提到,这2个框架均为日志门面,但common-logging(下文简称JCL)隶属于apache阵营,而slf4j与logback为同一作者。并且这两个框架与底层日志组件的绑定机制也不相同:
  • common-logging通过动态查找的机制,在程序运行时自动找出真正使用的日志库。由于它使用了ClassLoader寻找和载入底层的日志库,导致了像OSGI这样的框架无法正常工作,因为OSGI不同的插件使用自己ClassLoader。
  • slf4j在编译时静态绑定真正的Log库,因此可以在OSGI中使用。

二、如何集成slf4j

        在第一节中,我们解释了日志组件和日志门面的概念,同时提到了slf4j的优越性,接下来我们将讨论如何将slf4j与log4j、logback进行集成,以及如何在一个已经使用了common-logging、jul的遗留系统上无缝集成slf4j。

2.1.基本集成

        如果是一个新系统,或者你想对遗留系统的日志框架做一个完整的替换,可以引入如下依赖快速集成:
<!-- 日志组件log4j与slf4j的集成依赖 -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.25</version>
</dependency>

<!-- 日志组件logback与slf4j的集成依赖 -->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.7.25</version>
</dependency>

<!-- 日志组件jul与slf4j的集成依赖 -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-jdk14</artifactId>
<version>1.7.25</version>
</dependency>

<!-- 日志门面jcl与slf4j的集成依赖,将所有slf4j日志委派给jcl -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-jcl</artifactId>
<version>1.7.25</version>
</dependency>

2.2.使用桥接器

        在实际的应用中,我们会碰到不同的组件使用不同日志框架的情况,例如Spring Framework使用的是通过日志门面commons-logging输出日志,XSocket依赖的则是JUL。我们想统一它们的日志输出方式以便于管理。
        slf4j提供了现成的解决方案,那便是“桥接器”,它的功能是将这些不同形式的日志打印输出重定向到slf4j,然后slf4j又会根据绑定器把日志交给具体的日志实现工具。下面给出一个常用的应用桥接配置方案:
<!-- JUL桥接器,将jul的日志输出重定向到slf4j -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>jul-to-slf4j</artifactId>
</dependency>
<!-- JCL桥接器,将commos-logging的日志输出重定向到slf4j -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>jcl-over-slf4j</artifactId>
</dependency>
<!--log4j桥接器,将log4j的日志输出重定向到slf4j -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>log4j-over-slf4j</artifactId>
</dependency>
<!-- 日志组件logback与slf4j的集成依赖,各桥接器的重定向最终流向logback -->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
</dependency>
        将上述依赖转换为流程图:
        另外,使用桥接器的时候,我们需要注意避免与2.1中的jar包混淆使用,导致日志流死循环:
条件 原因
log4j-over-slf4j.jar和slf4j-log4j12.jar同时存在 slf4j-log4j12.jar会将所有日志调用委托给log4j,而log4j-over-slf4j.jar又将所有对log4j的调用委托给相应的slf4j,两者形成了一个死循环.
jul-to-slf4j.jar和slf4j-jdk14.jar同时存在 slf4j-jdk14.jar会将所有日志调用委托给jdk的log,而jul-to-slf4j.jar又将所有对jul-api的调用委托给相应的slf4j,两者形成了一个死循环。

JAVA日志框架概述的更多相关文章

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

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

  2. Java 日志框架终极教程

    概述 对于现代的 Java 应用程序来说,只要被部署到真实的生产环境,其日志的重要性就是不言而喻的,很难想象没有任何日志记录功能的应用程序被运行于生产环境中.日志 API 所能提供的功能是多种多样的, ...

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

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

  4. 转:Java程序员最常用的8个Java日志框架

    作为一名Java程序员,我们开发了很多Java应用程序,包括桌面应用.WEB应用以及移动应用.然而日志系统是一个成熟Java应用所必不可少的,在开发和调试阶段,日志可以帮助我们更好更快地定位bug:在 ...

  5. Java日志框架那些事儿

    文章首发于[博客园-陈树义],点击跳转到原文Java日志框架那些事儿. 在项目开发过程中,我们可以通过 debug 查找问题.而在线上环境我们查找问题只能通过打印日志的方式查找问题.因此对于一个项目而 ...

  6. Java基础学习总结(40)——Java程序员最常用的8个Java日志框架

    作为一名Java程序员,我们开发了很多Java应用程序,包括桌面应用.WEB应用以及移动应用.然而日志系统是一个成熟Java应用所必不可少的,在开发和调试阶段,日志可以帮助我们更好更快地定位bug:在 ...

  7. Java日志框架总结

    1. 前言 从写代码开始,就陆陆续续接触到了许多日志框架,较常用的属于LOG4J,LogBack等.每次自己写项目时,就copy前人的代码或网上的demo.配置log4j.properties或者lo ...

  8. Java-最常用的Java日志框架整理

    Java-最常用的Java日志框架整理 前言 Java程序员,我们开发了很多Java应用程序,包括桌面应用.WEB应用以及移动应用.然而日志系统是一个成熟Java应用所必不可少的,在开发和调试阶段,日 ...

  9. java日志框架系列(4):logback框架xml配置文件语法

    1.xml配置文件语法 由于logback配置文件语法特别灵活,因此无法用DTD或schema进行定义. 1.配置文件基本结构 配置文件基本结构:以<configuration>标签开头, ...

随机推荐

  1. Spring时间(Date)类型转换+自定义

    第一种方法:利用内置的 CustomDateEditor(不推荐,每个类都需要定义) 首先,在我们的 Controller 的 InitBinder 里面,注册 CustomEditor //首先初始 ...

  2. jQuery序列化Ajax提交表单

    var formData=$("form").serialize(); $.ajax({ type: "POST", url: "/front/EPt ...

  3. MVCPager分页使用方法

    public ActionResult AdminUserList(UserListModel model) { var pagedList = _userService.SearchAdminUse ...

  4. 如何在IAR工程中创建和使用模板

    路径为:Edit -> Code Templates -> Edit Templates  如下图: #TEMPLATE "&FileDeclare>&Fi ...

  5. Tuple和 ValueTuple

    这个类型还是学习C#7.0的语法在看到的,这边单独拿来学习下. 学习地址: https://docs.microsoft.com/zh-cn/dotnet/csharp/tuples https:// ...

  6. JQuery Ajax 使用FormData上传文件对象

    FormData部分: 先new FormData对象 :let somedata = new FormData(),然后将数据添加进去,这里我们使用append()进行添加. 这里举一个上传头像的例 ...

  7. 课时10.第一个HTML网页(掌握)

    网页的固定格式 编写网页和写信一样都有一套规范和要求,这套规范和要求中规定了写信的固定格式 写信基本结构 亲爱的xx: 你好! 我.................. ...... 此致 敬礼! xx ...

  8. Oracle模糊查询

    通配符 % 匹配零个或更多的任意字符 _ 匹配一个任意字符 [ ] 匹配指定范围中的一个字符([a-z],[0-9]) [^ ]      不属于指定范围,不包含其中的字符 escape转义 --查询 ...

  9. iOS合并真机和模拟器framework

    在实际的项目开发中,我们会碰到某些静态库只能在真机或者模拟器中的一个上可以运行.为了让静态库在模拟器和真机都可以正常的运行,就涉及到如何把一个工程生成的静态库打包以后生成的framework进行合并. ...

  10. NoSQL数据库浅析

    NoSQL(NoSQL = Not Only SQL ):非关系型的数据库.NoSQL有时也称作Not Only SQL的缩写,是对不同于传统的关系型数据库的数据库管理系统的统称. 今天我们可以通过第 ...