zoukankan      html  css  js  c++  java
  • Java 日志框架概述(slf4j / log4j / JUL / Common-logging(JCL) / logback)

    一、简介

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

    现在市面流行以 slf4j(Simple Logging Facade for Java)做日志接口,基于门面模式的思想,开发者只需熟悉/使用 slf4j API 即可,而具体实现则是可更替的。

    以 slf4j 的概念,共可划分为以下4种库:

    日志接口层 slf4j-api,common-logging
    日志实现层 JUL(java.util.logging)
    log4j
    logback
    slf4j-simple,slf4j-nop
    绑定适配(adaptation)层 slf4j-jcl
    slf4j-jdk14
    slf4j-log412
    桥接(bridge)层 jcl-over-slf4j
    jul-to-slf4j
    log4j-over-slf4j

    二、日志框架各层说明

    slf4j 几种流程示意图:Bridging legacy APIs
    image

    日志接口层

    接口层的作用上面已经说了
    以 SLF4J 为例,它并非日志的实现(当然也没有实现的概念,因为没有标准),而是各种日志框架(java.util.logging,logbacak,log4j)的简单门面(facade,门面设计模式)或抽象接口,允许用户在部署时选择期望的日志框架实现。

    日志实现层

    顾名思义,各种可用日志框架
    需注意:与JDBC这种官方接口规范不同,这些日志框架(如 log4j)并不一定实现自接口层 ,因为 slf4j接口 也只是第三方规范而已。
    但有些日志框架本身就是接口层框架的实现,比如 logback 本地实现了 slf4j

    绑定适配层

    为了让非本地实现 slf4j 的框架(如 log4j)也能在 slf4j API 下工作,据 sfl4j 版本不同有两种实现方式:

    1. (1.8 以前)静态绑定
    2. (1.8 以后)基于Java6 Java SPI (Service Provider Interface) 机制
      无论那种哪种,都是需要引入这样一种适配器包来实现

    桥接层

    为了不修改已有项目代码或想在项目中延用旧日志框架,同时又想让slf4j统一处理,可引入桥接包(如 log4j-over-slf4j.jar)替换原有的日志框架(log4j.jar),以此将日志重定向委托给 SLF4j

    注意:桥接层与实现层不能为同一个日志框架,否则将造成无限循环,这也很容易理解。例如:jcl-over-slf4j.jarslf4j-jcl.jar 不能同时使用

    三、各日志框架概述

    以下仅简略概述,有个大概印象即可(该篇目不意在深入某具体框架):

    1. Log4j
      Apache 的开源日志框架,名称含义 "Log for Java"

    2. JUL(java.util.logging)
      java.util.logging,由 JDK1.4 引入

    3. JCL(Jakarta Commons Logging)
      也叫 "Apache Commons Logging",也等同于常说的 common-logging,是为解决市面上不同日志库而最早诞生的日志接口标准。

      JCL 只提供日志接口,具体实现则是在"运行时动态寻找",其内部也有个 Simple logger 简单实现但功能很弱,因此仍会看到很多程序使用 JCL + log4j 这种搭配。
      动态查找原理概述:

      • 首先,寻找 org.apache.commons.logging.LogFactory 的属性配置
      • 否则,则利用 SPI 机制
      • 否则,读取类路径下 commons-logging.properties 的配置
      • 否则,若存在 log4j,默认使用 log4j
      • 否则,使用 JDK1.4 Logger
      • 否则,使用内部的 SimpleLog

      但随着程序规模越来越庞大时,JCL动态绑定并不总是能成功,这也是 SLF4J 诞生原因之一。

    4. SLF4J
      为改进 common-logging 而生的日志接口
      详见 SLF4J 快速入门 / 原理探究

    5. LogBack
      log4j 创始人设计的又一开源日志组件,通用、可靠、快速灵活 声称有极佳的性能。
      其一大特色是,其在 logback-classic 中本地(native)实现了 SLF4J API。
      当前分为三个模块:

      • logback-core:其他俩模块基础模块
      • logback-classic:日志模块,完整实现了 SLF4J API
      • logback-access:配合Servlet容器,提供 http 访问日志功能

    四、延申

    1. slf4j 制定了日志标准当然有优点,但 slf4j 为什么会成为标准,而非 jul 来指定标准(就像 JDBC 一样)?
      答:可参考此处提到的恩怨情仇 https://juejin.cn/post/6844904037641355271
    2. 一些jul相关包名上的 jdk14,指的是 JDK1.4(按现在版本规范来说是 JAVA 4),而不是 JAVA 14
      可以查看 java.util.logging.LogManager 上的 @since 1.4 可知
    3. 一些包上的 nop 表示 no-operation,即无操作空实现。

    参考:
    - java日志组件介绍(jcl,jul,slf4j,logback很全,很透,看了一遍差不多就明白了
    - 日志系列好文 https://www.cnblogs.com/xuningfans/p/12164734.html
    - http://www.slf4j.org/

    本文为博主原创文章,如需转载请注明链接出处! 如有帮助到你,还请留言支持一下,谢谢:) 若有问题,也欢迎讨论指正。
  • 相关阅读:
    SCI写作经典替换词,瞬间高大上!(转)
    最佳化常用测试函数 Optimization Test functions
    算法复杂度速查表
    VS 代码行统计
    CPLEX IDE 菜单栏语言设置( 中文 英文 韩文 等多国语言 设置)
    如何从PDF文件中提取矢量图
    Matlab无法打开M文件的错误( Undefined function or method 'uiopen' for input arguments of type 'char)
    visual studio 资源视图 空白 解决方案
    MFC DialogBar 按钮灰色不响应
    嗨翻C语言笔记(二)
  • 原文地址:https://www.cnblogs.com/simpleito/p/15125369.html
Copyright © 2011-2022 走看看