伯乐创业网、一个为创业者提供创业好项目和创业资讯的网站!
  • 微信客服微信客服
  • 微信公众号微信公众号
您现在的位置是:首页 > 专栏

log4j2(log4shell漏洞是log4j2)

用户投稿 2023年01月07日 05:11:07

老铁们,大家好,相信还有很多朋友对于log4j2和log4shell漏洞是log4j2的相关问题不太懂,没关系,今天就由我来为大家分享分享log4j2以及log4shell漏洞是log4j2的问题,文章篇幅可能偏长,希望可以帮助到大家,下面一起来看看吧!

1本文目录一览

2导致阿里云被处罚的log4j2是个什么?

阿里云的员工发现了log4j组件的重要安全漏洞,只上报了Apache,没有告知GXB,受到了处罚。

log4j2是从log4j一步步变过来的。它就是一个用Java编写的可靠、快速和灵活的日志框架,是在Apache软件许可证下发布的。

log4j开始与1996年初。当时它用作欧盟SEMPER(欧洲安全电子市场Secure Electronic Marketplace for Europe)项目的追踪API(应用程序接口)。

经过无数的增强和改进,最初的API就发展成为log4j,一种流行的Java日志包。

日志包就是用来记录系统或软件运行过程中的信息接口函数的集合,让开发软件的程序员调用来记录运行信息:程序跑到哪一步了?运行过程中出现了什么错误?等等。

日志记录模块是不跟普通用户打交道的,是给程序员调试用的。但它是软件开发的一个重要组成部分。编写良好的日志代码提供了快速调试、易于维护和结构化存储应用程序运行时信息的功能。

不过,日志记录模块也有它的缺点。它会降低应用程序的速度。而log4j则被设计成可靠、快速和可扩展的的日志包,再加上是开源的,因此用的非常多。

也正式因为应用广泛这个原因,log4j2的重要安全漏洞影响面也相应的很大。

3Log4j2简介和异步日志梳理

log4j2是log4j 1.x 的升级版,参考了logback的一些优秀的设计,并且修复了一些问题,因此带来了一些重大的提升,主要有:

之前看官方文档摘抄了一些概念,这里懒得翻译了,使用log4j的都应该清楚,这里只是mark下。

log4j2最大的特点就是异步日志,其性能的提升主要也是从异步日志中受益,我们来看看如何使用log4j2的异步日志。

Log4j2提供了两种实现日志的方式,一个是通过AsyncAppender,一个是通过AsyncLogger,分别对应前面我们说的Appender组件和Logger组件。注意这是两种不同的实现方式,在设计和源码上都是不同的体现。

AsyncAppender是通过引用别的Appender来实现的,当有日志事件到达时,会开启另外一个线程来处理它们。需要注意的是,如果在Appender的时候出现异常,对应用来说是无法感知的。 AsyncAppender应该在它引用的Appender之后配置,默认使用 java.util.concurrent.ArrayBlockingQueue实现而不需要其它外部的类库。 当使用此Appender的时候,在多线程的环境下需要注意,阻塞队列容易受到锁争用的影响,这可能会对性能产生影响。这时候,我们应该考虑使用无所的异步记录器(AsyncLogger)。

AsyncAppender有一些配置项,如下:

除此之外还有一些其他的细节,如果感兴趣可以参考官网文档,这里就不一一列举了。

AsyncLogger才是log4j2 的重头戏,也是官方推荐的异步方式。它可以使得调用Logger.log返回的更快。你可以有两种选择:全局异步和混合异步。

全局异步

配置文件不用动:

在系统初始化的时候,增加全局参数配置:

你可以在你第一次获取Logger之前设置,也可以加载JVM启动参数里,类似

混合异步

混合异步只需要修改配置文件即可:

在上面示例的配置中,root logger就是同步的,但是com.foo.Bar的logger就是异步的。

在使用异步日志的时候需要注意一些事项,如下:

4、如果不是确实需要,不要打印location信息,比如HTML的location,或者pattern模式里的%C or $class, %F or %file, %l or %location, %L or %line, %M or %method, 等,因为Log4j需要在打印日志的时候做一次栈的快照才能获取这些信息,这对于性能来说是个极大的损耗。

关于性能测试,大家可以直奔官网,哪里有很详细的数据,这里给个图:

虽然我测下来,在immediateFlush设置为false的情况下,同步异步差不了多少,但可能是我的测试条件不符合官方的,从设计和原理上来说,异步日志,无疑是个最优的选择。

总的来说,看了一遍log4j的官网文档,对日志系统有了个比较全面的了解,以前只是copy配置来改改,没关注过很多细节,这次算是扫盲了一次。文章也只是做了个介绍,在实际使用中,还是要细细研究下配置。

另外,个人觉得异步模式无非就是在原来同步写盘的前提下,增加消息队列作为缓存,或者交个另一个线程去做,这理论上除了带来一些额外的,较小的cpu和内存的开销,应该会在高流量的时候带来不小的性能提升,对比下来,log4j2无疑是当下最值得使用的日志组件来,且可以使用其异步模式。

当然了,也不能说异步就一定好,如果日志的流量不是特别大,磁盘性能又跟得上,没有必要一定使用异步日志。

4Log4j2基本使用入门

Apache Log4j 2是日志框架Log4j的升级,

它比其前身Log4j 1.x提供了重要的改进,

并且参考了Logback中许多有用的改进,

同时修复了Logback的一些固有问题。

详细请参考官网: Apache Log4j 2

本文介绍Log4j2的常用功能,

给出相应功能的参数配置方法,

最后给出一个完整的log4j2.xml配置文件,

作为工作开发中常用的日志配置参考。

在Maven的父工程pom.xml添加如下依赖:

在Maven的父工程pom.xml添加如下依赖管理:

然后在使用Log4j2的子工程pom.xml添加如下依赖,

这样就不用写具体的版本号了,

保证项目的子工程都使用相同版本的Log4j2。

在复杂场景下,可能不止依赖上面两个jar包,

这种方法可以保证Log4j2模块之间的版本一致。

为了演示Log4j2的功能,创建如下的测试类:

运行上面的测试程序,

在控制台打印出如下日志:

可以看到ERROR报错了,没有找到Log4j2的配置文件,

使用了默认配置,只打印error级别日志到console控制台,

然后控制台输出了error和fatal两个级别的日志信息。

Log4j2共有8种日志级别,

按照优先级从小到大排序:

当日志级别设置为某一级别时,

则会打印大于等于该级别的日志,

比如日志级别设置为ERROR,

则会打印ERROR,FATAL级别的日志。

ALL会把所有级别的日志打印出来,

OFF不会打印任何级别的日志,

所以严格来讲只有6种日志级别。

Log4j2能够在初始化期间自动配置,

它支持4种格式的配置文件:

Properties, YAML, JSON, XML

并且按从高到低的加权顺序查找配置文件。

Log4j2启动时,首先检查系统属性log4j.configurationFile,

如果设置了该属性,则匹配文件扩展名去加载配置文件,

就是说文件名可以是任意的,文件扩展名必须是上面的4种之一。

在启动应用时配置该参数,示例如下:

log4j.configurationFile可以配置如上的绝对路径,

也可以配置相对路径,即只配置文件名myLog4j2.xml,

Log4j2会在classpath路径中查找配置文件。

如果没有设置系统属性,

则在classpath路径中按照顺序查找如下4个文件:

如果找不到上面的文件,

则在classpath路径中按照顺序查找如下4个文件:

如果无法找到任何配置文件,

则使用默认配置文件,

这将导致日志输出到控制台。

在第4步中打印日志找不到配置文件,

使用的默认配置等价于下面的配置:

在上面的默认配置文件中,

主要有两类配置,

一类是Appenders:定义日志输出目的地,内容和格式等。

另一类是Loggers:定义日志级别和使用的Appenders。

表示日志输出到控制台的标准输出。

pattern定义日志输出格式:

实际会输出如下日志:

更多的PatternLayout设置请参考官网:

Log4j2 PatternLayout

新建log4j2.xml文件,

添加上面第7步的默认配置,

放到classpath路径下,

则应用启动时会读取该文件,

下面以该xml文件为例,

通过修改相应的配置,

演示Log4j2的功能。

实际上Log4j2的配置可以通过以下四种方式中的一种来完成:

本文主要介绍第1种,

详解XML格式文件的编写配置。

Log4j2内部日志可以输出到控制台,

status控制Log4j2内部日志的输出级别,

它的值可以填第5步中的日志级别,

Log4j2会输出初始化、翻转和其他内部操作的详细信息。

设置status="TRACE"对定位Log4j2问题非常有用。

也可以设置系统属性log4j2.debug,

也会将Log4j2内部日志打印到控制台,

包括在找到配置文件之前发生的内部日志。

在启动应用时配置该参数,示例如下:

Log4j2能够自动检测配置文件的修改,

并且自动重新加载配置。

通过在Configuration元素上配置monitorInterval属性,

并将其设置为非零值,

那么在下一次计算或记录日志事件,

且自上次检查以来已经超过monitorInterval时间,

则将检查该文件是否被修改。

注意时间单位默认为秒,

而且最小时间间隔是5秒。

如上示例为每隔至少5秒检查一次配置文件,

如果配置文件有变化则自动重新加载。

这里增加了一个类型为File的Appender,

name为File,

FileName为test.log,

表示日志会打印到test.log文件。

这里增加了一个Logger,需要配合上面的Appender使用,

name为Log4j2Test的包路径org.apache.logging.log4j,

level日志级别为EEROR,

AppenderRef指向了上面新增的名称为File的Appender,

表示Log4j2Test的ERROR和FATAL级别的日志会打印到test.log,

test.log文件内容:

同时additivity设置为true,

会将当前的Logger特性会传递给Root,

即上述的日志不仅会输出到test.log文件,

也会输出到Root指向的控制台,

Console控制台内容:

可以看到和上面文件中的内容一模一样。

Log4j2 入门教程

Log4j2 配置文件

Log4j2 Appenders

Frequently Asked Questions

OK,关于log4j2和log4shell漏洞是log4j2的内容到此结束了,希望对大家有所帮助。

版权声明:
本文内容由互联网用户自发贡献,该文观点仅代表作者本人,因此内容不代表本站观点、本站不对文章中的任何观点负责,内容版权归原作者所有、内容只用于提供信息阅读,无任何商业用途。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站(文章、图片、音频、视频)有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至3245813932@qq.com举报,一经查实,本站将立刻删除、维护您的正当权益。