log4j2 异步输出日志(转)

转自: http://www.jianshu.com/p/570b406bddcd

 

 

背景

随着业务服务(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.全局开关。

   a)我们只需要在你的classpath下面添加个log4j2.component.properties然后在里面配置

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

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

     b)

            

 static {
        System.setProperty("Log4jContextSelector",
            "org.apache.logging.log4j.core.async.AsyncLoggerContextSelector");
    }

     c)

   

JVM 参数:
-DLog4jContextSelector=
org.apache.logging.log4j.core.async.AsyncLoggerContextSelector

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

下面贴上我的简单配置:


 

猜你喜欢

转载自java12345678.iteye.com/blog/2384874