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

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

打印结果:

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

YD_1989

分享不易,非常感谢您的鼓励支持

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值