Java避免过度打印日志导致性能问题的解决

 更新时间:2026年06月27日 10:00:20   作者:YD_1989  
这篇文章主要介绍了Java避免过度打印日志导致性能问题的解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

前言

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

日常开发如何打印日志

1、优化日志结构

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

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

示例:

    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 循环中,更是浪费资源,我们应该使用占位符方式进行日志打印。

  • 错误示例:
log.info("测试日志打印入参是:" + JSON.toJSONString(testLogInDTO));
  • 正确示例:
log.info("名字是:{},测试日志打印入参:{}", testLogInDTO.getName(), JSON.toJSONString(testLogInDTO));

(3)必要时增加日志开关

(4)正确使用 INFO、ERROR

日常开发中用到最多的就是 INFO,但是并不是所有的日志都要用到 INFO 。我们要合适的去使用 INFO、ERROR 等日志等级。

比如笔者在日常开发中,会把 ERROR 等级写在 catch 异常代码块中,而不是使用 INFO。

2、异步化写日志

3、日志降级

完整示例

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();
    }
}

打印结果:

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • MyBatis动态SQL中数值0更新失效问题解析与解决方案

    MyBatis动态SQL中数值0更新失效问题解析与解决方案

    本文详细解析了MyBatis动态SQL中数值字段更新失效的问题,指出使用FastJSON的JSONObject接收入参时应避免混用字符串、数字判断,并提出两种解决方案,推荐采用数值字段最优方案,需要的朋友可以参考下
    2026-06-06
  • springboot获取微信JSDK签名信息的实现示例

    springboot获取微信JSDK签名信息的实现示例

    本文介绍了如何在Spring Boot应用中获取微信JSDK的签名信息,包括获取接口URL、参数设置、签名算法和获取签名结果的步骤,具有一定的参考价值,感兴趣的可以了解一下
    2023-11-11
  • SpringBoot多数据源配置完整指南

    SpringBoot多数据源配置完整指南

    在复杂的企业应用中,经常需要连接多个数据库,Spring Boot 提供了灵活的多数据源配置方式,以下是详细的实现方案,需要的朋友可以参考下
    2025-04-04
  • 关于Spring中的三级缓存解析

    关于Spring中的三级缓存解析

    这篇文章主要介绍了关于Spring中的三级缓存,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-08-08
  • Sprin中Bean的顺序使用及说明

    Sprin中Bean的顺序使用及说明

    这篇文章主要介绍了Sprin中Bean的顺序使用及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-05-05
  • Java中JSch与jsch.addIdentity()完全详细解析

    Java中JSch与jsch.addIdentity()完全详细解析

    JSch是SSH2的一个纯Java实现,它允许你连接到一个sshd服务器,使用端口转发,X11转发,文件传输等等,这篇文章主要介绍了Java中JSch与jsch.addIdentity()完全详细解析,需要的朋友可以参考下
    2026-01-01
  • Java实现Http请求的常用方法详解

    Java实现Http请求的常用方法详解

    在实际开发过程中,我们经常需要调用对方提供的接口或测试自己写的接口是否合适,本文为大家整理了Java调用第三方http接口几种方式,需要的可以参考下
    2025-02-02
  • SpringMVC框架自定义拦截器的过程详解

    SpringMVC框架自定义拦截器的过程详解

    文章主要介绍了SpringMVC框架中的拦截器及其工作原理,包括拦截器的定义、执行流程、与过滤器的区别,以及如何自定义和配置拦截器,本文给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧
    2025-11-11
  • 对SpringBoot项目Jar包进行加密防止反编译的方案

    对SpringBoot项目Jar包进行加密防止反编译的方案

    最近项目要求部署到其他公司的服务器上,但是又不想将源码泄露出去,要求对正式环境的启动包进行安全性处理,防止客户直接通过反编译工具将代码反编译出来,本文介绍了如何对SpringBoot项目Jar包进行加密防止反编译,需要的朋友可以参考下
    2024-08-08
  • Java的递归算法详解

    Java的递归算法详解

    Java递归算法是基于Java语言实现的递归算法。递归算法对解决一大类问题很有效,它可以使算法简洁和易于理解。接下来通过本文给大家介绍Java递归算法相关知识,感兴趣的朋友一起学习吧
    2021-09-09

最新评论