Java - 日志系统概述

作者: 齐晋 | 来源:发表于2018-05-23 16:49 被阅读129次

常见的日志框架

  • log4j
  • log4j2
  • logback
  • java util logging(简写为JUL)

log4j

在JDK 1.3及以前,Java打日志依赖System.out.println(), System.err.println()或者e.printStackTrace(),Debug日志被写到STDOUT流,错误日志被写到STDERR流。这样打日志有一个非常大的缺陷,即无法定制化,且日志粒度不够细。log4j是在这样的环境下诞生的,它是一个里程碑式的框架,它定义的Logger、Appender、Level等概念如今已经被广泛使用。

log4j可以当之无愧地说是Java日志框架的元老,1999年发布首个版本,2012年发布最后一个版本,2015年正式宣布终止,至今还有无数的系统在使用log4j,甚至很多新系统的日志框架选型仍在选择log4j。

在log4j被Apache Foundation收入门下之后,由于理念不合,log4j的作者Ceki离开并开发了slf4j和logback。

log4j2

Apache Logging一直在关门憋大招,log4j2在beta版鼓捣了几年,终于在2014年发布了GA版,不仅吸收了logback的先进功能,更通过优秀的锁机制、LMAX Disruptor、"无垃圾"机制等先进特性,在性能上全面超越了log4j和logback。

java util logging

受Log4j启发,Sun在Java1.4版本中引入了java.util.logging,但是j.u.l功能远不如log4j完善,开发者需要自己编写Appenders(Sun称之为Handlers),且只有两个Handlers可用(Console和File),j.u.l在Java1.5以后性能和可用性才有所提升。

logback

logback和log4j是同一个作者创作,它是log4j的升级版,因此logback相较于log4j有更多的优点:

  • 原生实现了SLF4J API(log4j需要一个中间层转换)
  • 支持XML、Groovy方式配置

遇到的问题

如上所述,java的日志框架种类繁多,不同的日志框架需要不同的配置。

加入项目A中使用log4j做为日志框架,而依赖的第三方库(假如说是guava)使用jul做为日志框架,那么,项目A不仅要有log4j的配置,还需要有jul的配置。

如果其他类库又使用了其他日志框架呢?

诸如此类的问题会是无休无尽?

怎么办?这时候就需要使用日志门面了。

所谓日志门面,如常用的slf4j,并不是日志框架。而是只提供简单的日志api。所有的工程和类库都是用slf4j的话,就不会有任何兼容问题。

那么,既然日志门面不是日志框架,日志具体由谁来输出呢?还是由上面所列的日志框架输出。日志门面和日志框架之间通过相应的api进行桥接。

这样,任何第三方类库,只要使用了slf4j来输出日志,由于没有指定具体的日志框架,因此使用方可以自行选取任何日志框架,都可以正确输出日志。

日志门面

  • commons-logging
  • slf4j

commons-logging

commons-logging不是一个日志打印框架,而是一个API bridge,开发者可以使用它兼容不同的日志框架(log4j和j.u.l)。然而,commons-logging对Log4j和j.u.l的配置问题兼容的并不好,使用commons-loggings还可能会遇到类加载问题,导致NoClassDefFoundError的错误出现。

slf4j

slf4j是一个“日志门面”(Logging Facade),而不是一个完整的日志框架。它提供了一套记录日志的api,但不提供输出日志的功能,而是通过对接如log4j、java.util.logging等日志框架,来实现日志的输出。

log4j的创始人Ceki发起了SLF4J(Simple Logging Facade for Java)项目,从设计模式的角度说,它是用来在log和代码层之间起到门面作用,对于用户来说只要使用SLF4J提供的接口,即可隐藏日志的具体实现,SLF4J提供的核心API是一些接口和一个LoggerFactory的工厂类,用户只需按照它提供的统一纪录日志接口,最终日志的格式、纪录级别、输出方式等可通过具体日志系统的配置来实现,因此可以灵活的切换日志系统

slf4j与常见日志框架的桥接

image.png
  • log4j(log4j1)的桥接器: slf4j-log4j12
  • log4j2的桥接器: log4j-slf4j-impl
  • jul的桥接器: slf4j-jdk14
  • logback天然与slf4j适配,不需要额外引入适配库(毕竟是一个作者写的)

参考

相关文章

  • Java - 日志系统概述

    常见的日志框架log4jlog4j2java util logginglogback 遇到的问题 日志门面comm...

  • Java日志概述

    今天看到了一篇对Java日志系统讲解很不错的文章,所以做个学习记录,如有侵权请联系删除 概述 Java的日志系统非...

  • java学习笔记-日志篇

    java学习笔记-日志篇-目录 java日志篇(1)-日志概述 java日志篇(2)-JUL(java.util....

  • 日志组件使用总结

    概述 由于Java日志功能发布较晚,开源社区的日志组件发展日趋成熟,导致应用系统中日志组件依赖比较混乱。 常见 l...

  • java中的日志框架

    各日志框架配置原则: 先看官网 --> 再看源代码 --> 最后中文博客 1.java中日志概述 1.1 java...

  • 复杂Spring项目中SLF4J最佳使用姿势

    一、Java日志体系概述 图1-1 展示了Java日志体系的三个主要部分: 日志门面接口(SLF4J、JCL) 一...

  • ELK入门

    一、概述 日志有什么用?日志主要包括系统日志、应用程序日志和安全日志。系统运维和开发人员可以通过日志了解服务器软硬...

  • Flume+Kafka双剑合璧玩转大数据平台日志采集

    概述 大数据平台每天会产生大量的日志,处理这些日志需要特定的日志系统。 一般而言,这些系统需要具有以下特征: 构建...

  • Java Streams API

    作者: 一字马胡 转载标志 【2017-11-03】 更新日志 Java Stream概述 Java Strea...

  • 有赞百亿级日志系统架构设计

    一、概述 日志是记录系统中各种问题信息的关键,也是一种常见的海量数据。日志平台为集团所有业务系统提供日志采集、消费...

网友评论

    本文标题:Java - 日志系统概述

    本文链接:https://www.haomeiwen.com/subject/esarjftx.html