LOG4J日志性能建议

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 原文地址:http://fredpuls.com/site/softwaredevelopment/java/log4j/log4j_performance_tips.htm     使用日志可能会让你的应用性能下降20% —— 很难相信吧,但是却是真的可能。

原文地址: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 这样的命令读不到缓存中没写入的消息。



相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
8天前
|
Java
日志框架log4j打印异常堆栈信息携带traceId,方便接口异常排查
日常项目运行日志,异常栈打印是不带traceId,导致排查问题查找异常栈很麻烦。
|
18天前
|
存储 监控 数据可视化
SLS 虽然不是直接使用 OSS 作为底层存储,但它凭借自身独特的存储架构和功能,为用户提供了一种专业、高效的日志服务解决方案。
【9月更文挑战第2天】SLS 虽然不是直接使用 OSS 作为底层存储,但它凭借自身独特的存储架构和功能,为用户提供了一种专业、高效的日志服务解决方案。
50 9
|
20天前
|
API C# 开发框架
WPF与Web服务集成大揭秘:手把手教你调用RESTful API,客户端与服务器端优劣对比全解析!
【8月更文挑战第31天】在现代软件开发中,WPF 和 Web 服务各具特色。WPF 以其出色的界面展示能力受到欢迎,而 Web 服务则凭借跨平台和易维护性在互联网应用中占有一席之地。本文探讨了 WPF 如何通过 HttpClient 类调用 RESTful API,并展示了基于 ASP.NET Core 的 Web 服务如何实现同样的功能。通过对比分析,揭示了两者各自的优缺点:WPF 客户端直接处理数据,减轻服务器负担,但需处理网络异常;Web 服务则能利用服务器端功能如缓存和权限验证,但可能增加服务器负载。希望本文能帮助开发者根据具体需求选择合适的技术方案。
55 0
|
20天前
|
C# Windows 监控
WPF应用跨界成长秘籍:深度揭秘如何与Windows服务完美交互,扩展功能无界限!
【8月更文挑战第31天】WPF(Windows Presentation Foundation)是 .NET 框架下的图形界面技术,具有丰富的界面设计和灵活的客户端功能。在某些场景下,WPF 应用需与 Windows 服务交互以实现后台任务处理、系统监控等功能。本文探讨了两者交互的方法,并通过示例代码展示了如何扩展 WPF 应用的功能。首先介绍了 Windows 服务的基础知识,然后阐述了创建 Windows 服务、设计通信接口及 WPF 客户端调用服务的具体步骤。通过合理的交互设计,WPF 应用可获得更强的后台处理能力和系统级操作权限,提升应用的整体性能。
42 0
|
22天前
|
存储 消息中间件 监控
Java日志详解:日志级别,优先级、配置文件、常见日志管理系统ELK、日志收集分析
Java日志详解:日志级别,优先级、配置文件、常见日志管理系统、日志收集分析。日志级别从小到大的关系(优先级从低到高): ALL < TRACE < DEBUG < INFO < WARN < ERROR < FATAL < OFF 低级别的会输出高级别的信息,高级别的不会输出低级别的信息
|
26天前
|
存储
【Azure Log A workspace】Azure上很多应用日志收集到Log A workspace后如何来分别各自的占比呢?
【Azure Log A workspace】Azure上很多应用日志收集到Log A workspace后如何来分别各自的占比呢?
|
26天前
|
API
【Azure 应用服务】当在Azure App Service的门户上 Log Stream 日志无输出,需要如何操作让其输出Application Logs呢?
【Azure 应用服务】当在Azure App Service的门户上 Log Stream 日志无输出,需要如何操作让其输出Application Logs呢?
|
30天前
|
XML Java Maven
log4j 日志的简单使用
这篇文章介绍了Log4j日志框架的基本使用方法,包括在Maven项目中添加依赖、配置`log4j.properties`文件以及在代码中创建和使用Logger对象进行日志记录,但实际打印结果中日志级别没有颜色显示。
log4j 日志的简单使用
|
1月前
|
XML Java Maven
Spring5入门到实战------16、Spring5新功能 --整合日志框架(Log4j2)
这篇文章是Spring5框架的入门到实战教程,介绍了Spring5的新功能——整合日志框架Log4j2,包括Spring5对日志框架的通用封装、如何在项目中引入Log4j2、编写Log4j2的XML配置文件,并通过测试类展示了如何使用Log4j2进行日志记录。
Spring5入门到实战------16、Spring5新功能 --整合日志框架(Log4j2)
|
1月前
|
存储 运维 Java
SpringBoot使用log4j2将日志记录到文件及自定义数据库
通过上述步骤,你可以在Spring Boot应用中利用Log4j2将日志输出到文件和数据库中。这不仅促进了良好的日志管理实践,也为应用的监控和故障排查提供了强大的工具。强调一点,配置文件和代码的具体实现可能需要根据应用的实际需求和运行环境进行调优和修改,始终记住测试配置以确保一切运行正常。
286 0