那些曾经遇到过的logger

【1】log4j框架

Log4j是Apache的一个开源项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件、GUI组件,甚至是套接口服务器、NT的事件记录器、UNIX Syslog守护进程等;我们也可以控制每一条日志的输出格式;通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。最令人感兴趣的就是,这些可以通过一个配置文件来灵活地进行配置,而不需要修改应用的代码。

2015年5月,Apache宣布log4j1.x 停止更新。最新版为1.2.17。

pom依赖:



   log4j
   log4j
   1.2.17

【2】log4j2框架

Apache Log4j 2是对Log4j的升级,它比其前身Log4j 1.x提供了重大改进,并提供了Logback中可用的许多改进,同时修复了Logback架构中的一些问题。

Log4j的API与实现分开,使应用程序开发人员可以清楚地了解可以使用哪些类和方法,同时确保向前兼容性。这使Log4j团队能够以安全且兼容的方式进行改进。


UTF-8
2.16.0



    org.apache.logging.log4j
    log4j-core
    ${log4j2.version}


    org.apache.logging.log4j
    log4j-api
    ${log4j2.version}

SpringBoot项目中使用log4j2:


    org.springframework.boot
    spring-boot-starter-web
    
    
        
            org.springframework.boot
            spring-boot-starter-logging
        
    




    org.springframework.boot
    spring-boot-starter-log4j2

【3】slf4j门面

SLF4J是为各种loging APIs提供一个简单统一的接口,从而使得最终用户能够在部署的时候配置自己希望的loging APIs实现。 Logging API实现既可以选择直接实现SLF4J接的loging APIs如: NLOG4J、SimpleLogger。也可以通过SLF4J提供的API实现来开发相应的适配器如Log4jLoggerAdapter、JDK14LoggerAdapter。

slf4j只是一个日志标准,并不是日志系统的具体实现。理解这句话非常重要,slf4j只做两件事情:提供日志接口,提供获取具体日志对象的方法。

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

它只提供一个核心slf4j api(就是slf4j-api.jar包),这个包只有日志的接口,并没有实现,所以如果要使用就得再给它提供一个实现了些接口的日志包,比 如:log4j,logback日志实现包等,但是这些日志实现又不能通过接口直接调用,实现上他们根本就和slf4j-api不一致,因此slf4j又增加了一层来转换各日志实 现包的使用,比如slf4j-log4j12等。


    org.slf4j
    slf4j-api
    1.7.25



    org.slf4j
    slf4j-log4j12
    1.7.25
    test



    org.slf4j
    jcl-over-slf4j
    1.7.14





    org.slf4j
    jul-to-slf4j
    1.7.32


slf4j-log4j12

当想使用slf4j+log4j这对组合时,你需要引入slf4j-log4j12这个适配器。

【4】Java.util.logging框架

Java 中的 Logging API 让 Java 应用可以记录不同级别的信息,它在debug过程中非常有用,如果系统因为各种各样的原因而崩溃,崩溃原因可以在日志中清晰地追溯,下面让我们来看看 Java 原生的 Logging 功能。

从1.4.2开始,Java 通过 Java.util.logging 包为应用程序提供了记录消息的可能,在 API 中的核心类为 Logger 类。理解在记录消息中的日志的不同级别是非常重要的。Java 为此定时了8个级别,它们是分别SEVERE, WARNING, INFO, CONFIG, FINE, FINER, FINEST 以及 ALL. 它们按照优先级降序排列,在应用运行的任何时间点,日志级别可以被更改。

通常来说,当为 Logger 指定了一个 Level, 该 Logger 会包含当前指定级别以及更高级别的日志。举例而言,如果 Level 被设置成了 WARNING, 所有的 warning 消息以及 SERVER 消息会被记录。应用可以用下列方法记录日志:Logger.warning(), Logger.info(), Logger.config() …

【5】logback框架

Logback是由log4j创始人设计的又一个开源日志组件。logback当前分成三个模块:logback-core,logback- classic和logback-access。

logback-core是其它两个模块的基础模块。logback-classic是log4j的一个 改良版本。此外logback-classic完整实现SLF4J API使你可以很方便地更换成其它日志系统如log4j或JDK14 Logging。logback-access访问模块与Servlet容器集成提供通过Http来访问日志的功能。

pom依赖:



    ch.qos.logback
    logback-classic
    1.2.8
    test




    ch.qos.logback
    logback-core
    1.2.8




    ch.qos.logback
    logback-access
    1.2.8


【6】Jakarta Commons logging门面

JCL,全称为”Jakarta Commons Logging”,也可称为”Apache Commons Logging”,是Apache提供的一个通用日志API。JCL采用了设计模式中的“适配器模式”,它是为“所有的Java日志实现”提供的一个统一的接口,然后在适配类中将对日志的操作委托给具体的日志框架,它自身也提供一个日志的实现,但是功能非常弱(SimpleLog)。所以一般不会单独使用它。它允许开发人员使用不同的具体日志实现工具:Log4j,jdk自带的日志(JUL)

pom文件



    commons-logging
    commons-logging
    1.2


【7】JBoss Logging 门面

是一款类似于slf4j的门面,本身不提供实现通常与log4j等具体日志框架集成。



    org.jboss.logging
    jboss-logging
    3.4.2.Final

【8】log4j2修复

Apache Log4j 远程代码执行漏洞,严重程度: 严重。

由于Apache Log4j2某些功能存在递归解析功能,攻击者可直接构造恶意请求,触发远程代码执行。漏洞利用无需特殊配置

情况分析:

Apache Log4j是一个基于Java的日志记录组件。Apache Log4j2是Log4j的升级版本,通过重写Log4j引入了丰富的功能特性。该日志组件被广泛应用于业务系统开发,用以记录程序输入输出日志信息。

2021年11月24日,阿里云安全团队向Apache官方报告了Apache Log4j2远程代码执行漏洞。由于Log4j2组件在处理程序日志记录时存在JNDI注入缺陷,未经授权的攻击者利用该,可向目标服务器发送精心构造的恶意数据,触发Log4j2组件解析缺陷,实现目标服务器的任意代码执行,获得目标服务器权限。

受影响的版本:

Apache log4j2 2.0 – 2.14.1 版本均受影响。涉及的代码包为:org.apache.logging.log4j:log4j-api 与 org.apache.logging.log4j:log4j-core。

如果项目使用了maven,可能如下所以,这里我们可以修复为最新版本2.16.0


    org.apache.logging.log4j
    log4j-core
    2.16.0


    org.apache.logging.log4j
    log4j-api
    2.16.0

<depe

如果是springboot项目,则更简单,直接做如下配置即可:


    1.8
    2.16.0

这和springboot的依赖管理有关。如下图所示,在spring-boot-starter-parent的pom中有spring-boot-dependencies

这里我们干脆放出来完整的spring-boot-dependencies 的pom 文件,如下所示其维护了诸多子依赖的版本,那么我们在外层定义2.16.0,就可以告诉springboot使用我们指定的版本。



  4.0.0
  org.springframework.boot
  spring-boot-dependencies
  2.3.4.RELEASE
  pom
  spring-boot-dependencies
  Spring Boot Dependencies

  
    5.15.13
    2.7.7
    1.9.82
    2.12.0
    1.9.6
    3.16.1
    4.0.6
    4.0.3
    2.1.4
    3.1.0
    1.10.14
    2.8.5
    4.6.1
    1.5.1
    1.14
    2.7.0
    3.10
    1.6
    2.8.1
    3.0.8
    11.5.4.0
    1.0.10.RELEASE
    10.14.2.0
    4.1.12.1
    2.10.6
    3.8.1
    7.6.2
    2.2.0
    1.6.0
    1.2.5
    6.4.4
    2.3.30
    3.0.1
    3.0.3
    2.3.3
    2.5.13
    2.8.6
    

1.4.200

2.2 3.12.9 1.3.2 5.4.21.Final 6.1.5.Final 3.4.5 2.5.1 2.40.0 4.1.4 4.5.12 4.4.13 10.1.8.Final 2.18 2.11.2 1.2.2 1.3.5 2.0.3 1.1.6 1.0.2 1.6.5 2.2.3 4.0.4 1.2.7 1.3.3 2.0.2 1.1.2 2.1.6 2.3.3 1.4.2 2.3.3 3.1.2 1.2.0 1.3.2 1.1.1 2.3.1 2.3.1 2.0.1 1.1.4 1.0 1.6.2 1.0.3 2.2 1.3 2.0.1.Final 1.1 1.2.0 3.0.9 3.4.1.Final 7.6.0.Final 2.0.6 3.3.0 2.30.1 8.5.54 2.2.0.v201112011158 1.1.4 9.4.31.v20200723 1.15 1.2.8 1.6.2 3.13.4 2.4.0 2.3 1.5.0 1.2 1.3.1 4.13 5.6.2 2.5.1 1.3.72 1.3.8 5.3.4.RELEASE 3.8.9 2.13.3 1.2.3 1.18.12 2.6.2 1.8 3.3.0 3.1.0 3.8.1 3.1.2 2.8.2 3.0.0-M3 2.22.2 3.2.0 2.5.2 3.2.1 3.2.0 3.2.0 3.1.0 3.2.4 3.2.1 2.22.2 3.2.3 1.5.5 1.9.13 3.3.3 4.0.5 7.4.1.jre8 8.0.21 1.9.22 3.2.16 4.1.52.Final 2.0.34.Final 1.1.0 7.1.1 8.19 19.3.0.0 3.14.9 19.3.0.0 1.1.2 42.2.16 0.9.0 2.3.2 4.3.1 Arabba-SR7 5.9.0 1.0.3 Dysprosium-SR12 3.3.0 1.0.2 1.3.8 1.2.1 2.2.19 1.5.2 3.141.59 2.40.0 4.4.8 4.0.1 1.7.30 1.26 8.5.2 2.2.11.RELEASE 4.2.4.RELEASE Neumann-SR4 5.2.9.RELEASE 1.1.2.RELEASE 5.3.2.RELEASE 2.5.6.RELEASE 2.3.3.RELEASE 2.0.5.RELEASE 1.2.5.RELEASE 5.3.4.RELEASE Dragonfruit-SR1 3.0.10.RELEASE 3.31.1 1.6.5 3.0.11.RELEASE 2.0.1 3.0.4.RELEASE 3.0.4.RELEASE 2.4.1 9.0.38 4.0.14 2.1.4.Final 2.7 3325375 0.45 1.6.3 1.0.2 2.7.0

发表评论