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日志并进行多维度分析。
目录
相关文章
|
19天前
|
XML 安全 Java
【日志框架整合】Slf4j、Log4j、Log4j2、Logback配置模板
本文介绍了Java日志框架的基本概念和使用方法,重点讨论了SLF4J、Log4j、Logback和Log4j2之间的关系及其性能对比。SLF4J作为一个日志抽象层,允许开发者使用统一的日志接口,而Log4j、Logback和Log4j2则是具体的日志实现框架。Log4j2在性能上优于Logback,推荐在新项目中使用。文章还详细说明了如何在Spring Boot项目中配置Log4j2和Logback,以及如何使用Lombok简化日志记录。最后,提供了一些日志配置的最佳实践,包括滚动日志、统一日志格式和提高日志性能的方法。
154 30
【日志框架整合】Slf4j、Log4j、Log4j2、Logback配置模板
|
1月前
|
XML JSON Java
Logback 与 log4j2 性能对比:谁才是日志框架的性能王者?
【10月更文挑战第5天】在Java开发中,日志框架是不可或缺的工具,它们帮助我们记录系统运行时的信息、警告和错误,对于开发人员来说至关重要。在众多日志框架中,Logback和log4j2以其卓越的性能和丰富的功能脱颖而出,成为开发者们的首选。本文将深入探讨Logback与log4j2在性能方面的对比,通过详细的分析和实例,帮助大家理解两者之间的性能差异,以便在实际项目中做出更明智的选择。
244 3
|
1月前
|
Python
log日志学习
【10月更文挑战第9天】 python处理log打印模块log的使用和介绍
35 0
|
1月前
|
数据可视化
Tensorboard可视化学习笔记(一):如何可视化通过网页查看log日志
关于如何使用TensorBoard进行数据可视化的教程,包括TensorBoard的安装、配置环境变量、将数据写入TensorBoard、启动TensorBoard以及如何通过网页查看日志文件。
213 0
|
2月前
|
Java
日志框架log4j打印异常堆栈信息携带traceId,方便接口异常排查
日常项目运行日志,异常栈打印是不带traceId,导致排查问题查找异常栈很麻烦。
|
3月前
|
XML Java Maven
log4j 日志的简单使用
这篇文章介绍了Log4j日志框架的基本使用方法,包括在Maven项目中添加依赖、配置`log4j.properties`文件以及在代码中创建和使用Logger对象进行日志记录,但实际打印结果中日志级别没有颜色显示。
log4j 日志的简单使用
|
3月前
|
XML Java Maven
Spring5入门到实战------16、Spring5新功能 --整合日志框架(Log4j2)
这篇文章是Spring5框架的入门到实战教程,介绍了Spring5的新功能——整合日志框架Log4j2,包括Spring5对日志框架的通用封装、如何在项目中引入Log4j2、编写Log4j2的XML配置文件,并通过测试类展示了如何使用Log4j2进行日志记录。
Spring5入门到实战------16、Spring5新功能 --整合日志框架(Log4j2)
|
3月前
|
存储 消息中间件 监控
Java日志详解:日志级别,优先级、配置文件、常见日志管理系统ELK、日志收集分析
Java日志详解:日志级别,优先级、配置文件、常见日志管理系统、日志收集分析。日志级别从小到大的关系(优先级从低到高): ALL < TRACE < DEBUG < INFO < WARN < ERROR < FATAL < OFF 低级别的会输出高级别的信息,高级别的不会输出低级别的信息
|
4月前
|
Java 测试技术 Apache
《手把手教你》系列基础篇(八十六)-java+ selenium自动化测试-框架设计基础-Log4j实现日志输出(详解教程)
【7月更文挑战第4天】Apache Log4j 是一个广泛使用的 Java 日志框架,它允许开发者控制日志信息的输出目的地、格式和级别。Log4j 包含三个主要组件:Loggers(记录器)负责生成日志信息,Appenders(输出源)确定日志输出的位置(如控制台、文件、数据库等),而 Layouts(布局)则控制日志信息的格式。通过配置 Log4j,可以灵活地定制日志记录行为。
55 4
|
3月前
|
存储 运维 Java
SpringBoot使用log4j2将日志记录到文件及自定义数据库
通过上述步骤,你可以在Spring Boot应用中利用Log4j2将日志输出到文件和数据库中。这不仅促进了良好的日志管理实践,也为应用的监控和故障排查提供了强大的工具。强调一点,配置文件和代码的具体实现可能需要根据应用的实际需求和运行环境进行调优和修改,始终记住测试配置以确保一切运行正常。
643 0
下一篇
无影云桌面