java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > Java避免过度打印日志导致性能

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

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

打印结果:

总结

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

您可能感兴趣的文章:
阅读全文