Log4j2简介和异步日志梳理

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Log4j2简介和异步日志梳理相关的知识,希望对你有一定的参考价值。

参考技术A

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无疑是当下最值得使用的日志组件来,且可以使用其异步模式。

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

以上是关于Log4j2简介和异步日志梳理的主要内容,如果未能解决你的问题,请参考以下文章

Log4j2中的同步日志与异步日志

Log4j2同步日志,混合日志和异步日志配置详解

如何监控 Log4j2 异步日志遇到写入瓶颈

Log4j2异步日志同步日志和混合日志的配置详解

log4j2 异步日志原理及配置

Log4j2 的分模块/分包日志输出