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

背景

随着业务服务(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高级配置以及简单的示例

推荐阅读更多精彩内容

  • 历史 log4j可以当之无愧地说是Java日志框架的元老,1999年发布首个版本,2012年发布最后一个版本,20...
    kelgon阅读 8,168评论 3 52
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 84,216评论 14 122
  • 概述 在项目开发中,为了跟踪代码的运行情况,常常要使用日志来记录信息。在Java世界,有很多的日志工具库来实现日志...
    静默虚空阅读 1,177评论 1 8
  • [TOC] Java 日志框架解析:设计模式、性能 在平常的系统开发中,日志起到了重要的作用,日志写得好对于线上问...
    albon阅读 1,819评论 1 6
  • 不知道当时打动我的是歌词,还是当时的情景,加上那歌词刚好就牵动了我的心弦。记得那是我要离开那座城市的前一天晚上,我...
    彼岸花的思念WYY阅读 48评论 0 0