×

看log4j2如何秒杀一切日志组件

96
兵阳
2016.11.03 11:38* 字数 724

背景

随着业务服务(Server App)逐渐增加,我们的业务系统中的日志输出面临的问题越来越多,高并发下对磁盘io这块消耗的越来越大,因此,急需要一个高性能且最好能够支持异步输出日志的日志框架,而且能兼容市面上目前主流的日志组件(log4j1.x,logback等)。

组件介绍

今天给大家介绍的一款日志组件是log4j2.我们不要光单单的看名字就以为是log4j1.x的升级过来的。log4j2和log4j是一个作者,只不过log4j2是重新架构的一款日志组件,他抛弃了之前log4j的不足,以及吸取了优秀的logback的设计重新推出的一款新组件。目前log4j已经基本停止更新,我们在maven中央仓库搜索的时候也会看到如下的注意



log4j2的社区活跃很频繁而且更新的也很快。下面我也不过多介绍需要详细了解的点

log4j2官方开发指南。下面我直接上重点。告诉大家如何使用log4j2来秒杀一切其他日志组件。

使用

log4j2之所以能秒杀一切日志组件,是因为它支持异步输出日志,在我的一项测试中,发现打印2000w个字符到日志文件中,采用log4j2的仅仅只需要200ms做有,而log4j却需要足足的将近150s.

我可以将示例代码贴出来供大家测试。

下面贴上log4j2的异步性能对比测试图:

log4j2同步和异步性能对比

log4j2的异步对比其他log日志框架

log4j2异步输出配置前置环境支持:加入disruptor3.0.0.jar版本或以上版本的依赖.

log4j2目前支持两种异步输出配置:

1.全局开关。我们只需要在你的classpath下面添加个log4j2.component.properties然后在里面配置

Log4jContextSelector=org.apache.logging.log4j.core.async.AsyncLoggerContextSelector

这样你就可以配置个普通的log4j2配置就是全量的异步输出日志了。不过,这种方式在我的测试中发现,会有一种问题,当你的程序是main方法启动测试的时候,当程序执行完毕,会有日志没有及时刷进去的可能。

2.异步标签。异步标签这个不需要任何其他配置,只需要一个log4j2的配置,然后在需要使用异步日志输出的时候,用AsyncLogger标签来包括起来就行。这个方案经过本人亲自尝试,而且性能很好。且灵活建议大家在线上使用这个方式。

下面贴上我的简单配置:

关于更多了解的,大家可以关注我的博客,

Log4j2高级配置以及简单的示例

日记本
Web note ad 1