Java如何避免过度打印日志导致性能问题

devtools/2024/12/26 15:32:48/

文章目录

  • Java如何避免过度打印日志导致性能问题
    • 前言
    • 日常开发如何打印日志
      • 1、优化日志结构
        • (1)不要打印一些没用的日志,也不要在 for 循环里面去打印
        • (2)不要做字符串的拼接,多用占位符
        • (3)必要时增加日志开关
        • (4)正确使用 INFO、ERROR
      • 2、异步化写日志
      • 3、日志降级
    • 完整示例

Java如何避免过度打印日志导致性能问题

前言

在项目开发中打印日志是非常重要的,可以帮助我们排查、定位很多很难发现的问题。但是日志并不是越多越好,如果过度打印,大量的日志写入服务器的磁盘里面,反而会出现很多问题。

日常开发如何打印日志

1、优化日志结构

(1)不要打印一些没用的日志,也不要在 for 循环里面去打印

日常开发中通常会首先把接口的入参、出参给打印出来,这样方便查找初始参数和最终结果,方便查看问题。其他可以根据自己的实际情况进行打印。

示例:

java">    public String testLogWrite(TestLogInDTO testLogInDTO) {log.info("名字是:{},测试日志打印入参:{}", testLogInDTO.getName(), JSON.toJSONString(testLogInDTO));StringBuilder stringBuilder = new StringBuilder("他的名字是:");stringBuilder.append(testLogInDTO.getName()).append(",家庭住址是:").append(testLogInDTO.getAddress());log.info("测试日志打印出参:{}", stringBuilder.toString());return stringBuilder.toString();}
(2)不要做字符串的拼接,多用占位符

每位如果使用字符串拼接,每一次字符串拼接都会创建新的字符串对象,尤其在 for 循环中,更是浪费资源,我们应该使用占位符方式进行日志打印。

错误示例:

java">log.info("测试日志打印入参是:" + JSON.toJSONString(testLogInDTO));

正确示例:

java">log.info("名字是:{},测试日志打印入参:{}", testLogInDTO.getName(), JSON.toJSONString(testLogInDTO));
(3)必要时增加日志开关
(4)正确使用 INFO、ERROR

日常开发中用到最多的就是 INFO,但是并不是所有的日志都要用到 INFO 。我们要合适的去使用 INFO、ERROR 等日志等级。比如笔者在日常开发中,会把 ERROR 等级写在 catch 异常代码块中,而不是使用 INFO。

2、异步化写日志

3、日志降级

完整示例

java">import com.alibaba.fastjson2.JSON;
import com.ruoyi.system.dto.TestLogInDTO;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;@Service
public class LogWriteService {private static final Logger log = LoggerFactory.getLogger(LogWriteService.class);public String testLogWrite(TestLogInDTO testLogInDTO) {log.info("名字是:{},测试日志打印入参:{}", testLogInDTO.getName(), JSON.toJSONString(testLogInDTO));String a = "251220aa24";SimpleDateFormat f = new SimpleDateFormat("yyyyMMdd");try {Date date = f.parse(a);} catch (ParseException e) {log.error("时间转换异常,详细错误信息是:{}", e.getMessage());}StringBuilder stringBuilder = new StringBuilder("他的名字是:");stringBuilder.append(testLogInDTO.getName()).append(",家庭住址是:").append(testLogInDTO.getAddress());log.info("测试日志打印出参:{}", stringBuilder.toString());return stringBuilder.toString();}
}

打印结果:

在这里插入图片描述


http://www.ppmy.cn/devtools/145561.html

相关文章

成功解决GPU和Cuda环境下执行torch.__version__输出2.0.1+cpu而不是正确版本(如2.1.0+cu121)等类似问题?

成功解决GPU和Cuda环境下执行torch.__version__输出2.0.1+cpu而不是正确版本(如2.1.0+cu121)等类似问题? 目录 解决问题 解决思路 T1、安装了CPU版本的PyTorch T2、环境问题 解决方法 重新安装 再次测试 解决问题 GPU和Cuda环境下执行torch.__version__输出2.0.1+cpu而…

游戏引擎学习第58天

发现一个vscode Log 断点的用法 回顾 我们正在继续推进工作,之前做了一些测试和清理工作,但还有一件事没有完成,因此我们还没有完全回到功能平衡的状态。昨天我们已经为实体做了空间划分,所以接下来的目标是继续完成这部分工作&a…

HarmonyOS NEXT 实战之元服务:静态案例效果---电台推荐

背景: 前几篇学习了元服务,后面几期就让我们开发简单的元服务吧,里面丰富的内容大家自己加,本期案例 仅供参考 先上本期效果图 ,里面图片自行替换 效果图1完整代码案例如下: Index import { authentica…

怎样正确做 Web 应用的压力测试?

Web应用,通俗来讲就是一个网站,主要依托于浏览器来访问其功能。 那怎么正确做网站的压力测试呢? 提到压力测试,我们想到的是服务端压力测试,其实这是片面的,完整的压力测试包含服务端压力测试和前端压力测…

音视频入门知识(五):流媒体篇

⭐五、流媒体篇 ES流(基本流) 在视频或音频编码后,最初得到的就是ES流。例如H.264、H.265、AAC、MP3等编码格式 单一性:每个ES流只包含一种类型的数据,如编码后的视频帧或音频帧。 无时间戳:ES流本身不包含…

探秘 DNS 服务器:揭开域名解析的神秘面纱

嘿,小伙伴们!在我们畅游互联网的奇妙世界时,有没有想过,当我们在浏览器中输入那些熟悉的网址,比如b站,是如何瞬间就能访问到对应的网站呢?这背后的魔法就来自于一个超级重要的网络基础设施 ——…

02-18.python入门基础一基础算法

(一)排序算法 简述: 在 Python 中,有多种常用的排序算法,下面为你详细介绍几种常见的排序算法及其原理、实现代码、时间复杂度以及稳定性等特点,并对比它们适用的场景。 冒泡排序(Bubble Sor…

aws(学习笔记第十九课) 使用ECS和Fargate进行容器开发

aws(学习笔记第十九课) 使用ECS和Fargate进行容器开发 学习内容: 使用本地EC2中部署docker应用使用ECS的EC2模式进行容器开发使用ECS的Fargate模式进行容器开发 1. 使用本地EC2中部署docker应用 docker整体 这里展示了docker的整体流程。 开发阶段 编写dockerfile…