`
somefuture
  • 浏览: 1077828 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

LOG4J日志性能建议

阅读更多

原文地址:http://fredpuls.com/site/softwaredevelopment/java/log4j/log4j_performance_tips.htm

 

 

使用日志可能会让你的应用性能下降20% —— 很难相信吧,但是却是真的可能。

本文讨论一些尽可能提升日志性能的方法,

2 关键设置

这里通过Junit,使用不同的Log4j配置来测试。下面会展示测试结果。实际上影响log4j性能的最主要因素有三:
  1. immediateFlush
  2. bufferedIO
  3. asycAppender
测试的结果可能和你想的不一样。比如,使用asyncAppender会降低本地日志文件的写入性能;bufferedIO不怎么样影响性能除非日志特别多;immediateFlush设为false几乎可以使写入时间减半。怎么回事呢?我们来看!



3 就是缓存

上面三个都是使用缓存,他们分三级。第一级, immediateFlush=false 会开启 java.io.Writer/java.io.OutputStreamWriter 的缓存,消息到达后会缓存最长1024字节。第二级 bufferedIO=true 会把 java.io.Writer 包装成 java.io.BufferedWriter ,缓存默认大小是 1024*8 字节。第三级是 asyncAppender ,会缓存Log4j事件,默认是128条。

一般地,输出流在使用的时候其他写入会被阻塞。使用缓存后可以减少这种阻塞。但是如果本来就没有阻塞(比如在写入本地日志的时候),使用缓存反而会延迟写入。这样讲的话,使用缓存反而没提升性能。所以性能调优要看情况:你使用的是本地日志还是远程日志,什么会造成资源竞争。



4 测试结果

这个测试很简单,使用log4j输出2560行,看看不同的配置使用的时间如何。我们考察上面的三个因素:

 

每个相同的测试我们跑了三次。前三行结果是log4j的默认配置:同步+无缓存+立即刷入。第一条结果是157毫秒,我们忽略它,因为它和后两条(63毫秒,62毫秒)差距太大。

接下来三行 (63, 63, 62 milliseconds) 开启了缓存但是还是立即刷入。你可能想到这没用,立即刷入让缓存无用武之地。所以结果和前面一致还是60多毫秒。

然后我们看开启缓存后不立即刷入,也就是 immediateFlush=false,结果是(31, 32, 31 milliseconds)。差不多是前面的一半,好厉害!

如果关闭缓存不立即刷入呢?这个和上面结果一样。

接下来看异步日志。我们关闭缓存并且立即刷入,结果是 (78, 78, 94 milliseconds)。异步日志没有改善性能,反而降低了我们的性能。

最后,我们使用异步日志结合缓存打开、不立即刷入,结果是 (63, 47, 47 milliseconds) ,依然没有同步的效果好。

恩?咋回事呢?


5 总结

Log4j性能建议
本地日志:
  1. 要速度快就关闭立即写入,缓存使用默认。缺点是系统崩溃的时候缓存里面没写入文件的消息都丢失了。
  2. 别使用asycAppender,它实际上比同步用的时间长。因为没阻塞的时候异步逻辑比同步逻辑复杂时间更长。
远程日志:
  1. 使用asyncAppender。只有异步队列满了才会开启和关闭一次网络连接。
  2. 使用缓存bufferedIO ,它会把Writer 包装成BufferedWriter .
注意:
  1. 如果日志带来的性能下降不严重,就不要调优。调优反而会带来其他问题。
  2. 日志配置文件修改后一般不用重启就能生效。
  3. 改用远程日志的时候一定要做性能测试。
调试的时候:
  1. 使用log4j默认设置。
  2. 开启缓存的时候使用tail -f 这样的命令读不到缓存中没写入的消息。



分享到:
评论

相关推荐

    Log4j2异步写日志效率测试源码

    对Log4j2异步写日志的效率测试源码

    Flume-ng在windows环境搭建并测试+log4j日志通过Flume输出到HDFS.docx

    Flume-ng在windows环境搭建并测试+log4j日志通过Flume输出到HDFS 11111

    log4j2 demo 性能测试

    log4j2 demo 性能测试 异步日志

    apache-log4j-2.3 核心jar包

    log4j 2.3版本Jar包。...Log4j 2是log4j 1.x和logback的改进版,据说采用了一些新技术(无锁异步、等等),使得日志的吞吐量、性能比log4j 1.x提高10倍,并解决了一些死锁的bug,而且配置更加简单灵活。

    SpringBoot日志插件log4J和slf4J的使用和比较含完整示例

    如果需要一个完整的日志解决方案并且对性能和资源占用不太敏感,Log4j 可能是一个不错的选择。如果更倾向于灵活性、可插拔性和现代应用集成,Slf4j 可能更为合适。无论选择哪个框架,都应确保正确配置并遵循最佳实践...

    实现Log4j连接池

    log4j功能强大,但是将日志写入数据库,感觉其性能相当差,究其原因是:log4j在每写一次日志的时候都建立和释放一个数据库连接,系统的性能消耗在频繁建立昂贵的连接上。本例简单的实现Log4j连接池,一起学习,...

    log5j工具包

    log5j在log4j的基础上提供了几个改进,应该说是简单和实用的封装。有趣的是log5j主页对自己名字的解释,因为要感谢JDK 1.5,所以才叫了这个名字。

    apache-log4j-2.0-rc2-bin.zi

    log4j-2.0版本是log4j的最新版本,跟1.x版本相比较多了很多新功能。同时在性能上有很大提高,在多线程环境下,异步日志系统比 Log4j 1.x 和Logback 提高了10倍性能提升。

    zlog---比log4c更牛的c语言日志库

    可以灵活配置日志输出的格式,类似于log4j的pattern layout 纲目分类模型,比log4j系列的继承模型更加清晰 多种输出,包括动态文件、静态文件、stdout、stderr、syslog 可以在运行时动态刷新配置,只需要调用函数...

    log4pb, pb的日志组件, 后台线程记录日志

    log4pb调用演示例子, 思想仿log4j // 2. 集成对象到application, // 3. 组件文件: log4pb90.pdb + callback.pbd, // 4. SQL目录包含一些数据库对象,目前支持postgresql和MS SQL(修改下表log4pb_log可支持其他...

    Log2Window:Log2Window是log4net,nlog,eventLog,log4j和log4cxx的日志消息查看器,具有极强的稳定性和非常好的性能。 它可以在一秒钟内处理数百万条日志消息

    Log2Window Log2Window是log4net,nlog,eventLog,log4j和log4cxx的日志消息查看器,具有极强的稳定性和非常好的性能。 它可以在一秒钟内处理数百万条日志消息。

    Java开发-日志管理-logback框架日志系统基础

    在日常工程开发中,日志是非常重要的一部分,通过日志可以迅速定位线上问题,日志框架也有很多选择,日志框架Logback和Log4j是同一个作者,Logback相比于Log4j,性能提高了10倍以上的性能,占用的内存也变小了,并且...

    slf4j-gao.rar

    分享我写的彩色控制台日志组件-基于slf4j-simple改造。 有颜色、最简单/全面的log内容、最佳的性能,能够定制所有的内容,所以我写了一个彩色控制台log的java组件。 原创不易多多支持。

    log4cxx源码编译和示例

    C和C++的经典日志模块log4cxx和其开发示例源码,是apache log4j的C、C++移植类,性能强大,也是公司使用的首选。

    Logback日志系统文件

    Logback是由log4j创始人设计的另一个开源日志组件,基于slf4j的日志规范实现的框架,性能比log4j要好。 Logback主要分为三个技术模块: logback-core:该模块为其他两个模块奠定了基础。 logback-classic:是log4j...

    java日志框架视频教程

    Log4j组件解析3. Layout格式4. Appender输出5. 自定义Logger章节四:JCL1. 快速入门2. 原理解析章节五:Slf4j1. 快速入门2. 绑定日志实现3. 桥接旧日志实现4. 原理解析章节六:Logback1. 快速入门2. 配置文件3. ...

    blitz4j, 用于快速异步日志记录的日志框架.zip

    blitz4j, 用于快速异步日志记录的日志框架 Blitz4jBlitz4j是构建在 Log4J 之上的日志框架,它在不影响应用程序性能特性的情况下减少争用。在 Netflix,Blitz4j用于记录数十亿个事件,用于监视。商业智能报告。调试和...

    Java日志体系全解析:架构师必掌握的关键技术和最佳实践

    最初,log4j作为早期流行的日志框架,广泛应用于Java项目中。然而,随着Java平台的发展,出现了多种日志框架,如JUL(java.util.logging)和JCL(Jakarta Commons Logging),这增加了选择和维护的复杂性。JCL作为一...

    Java应用日志框架TNT4J.zip

    TNT4J是一个改进Log4J新的开源Java应用日志框架。用于应用程序活动的跟踪、相关性检查、诊断,可以跨多个应用程序,运行时,服务器,地理的位置。这个API是专门用以解决分布式,并发,多线程,多用户应用,包括活动...

Global site tag (gtag.js) - Google Analytics