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