news 2026/7/15 20:22:02

【Java踩坑笔记】45_日志打印对象用toString,生产环境可能引发雪崩

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【Java踩坑笔记】45_日志打印对象用toString,生产环境可能引发雪崩

45 | 日志打印对象用 toString,生产环境可能引发雪崩

摘要log.info("订单:{}", order)会触发order.toString(),如果toString()里拼接了大量字段或有循环引用,生产环境高并发下会引发性能雪崩。


一、问题现象

// ❌ 危险:直接打印整个对象log.info("处理订单:{}",order);// order.toString() 可能是:publicStringtoString(){return"Order{id="+id+", userId="+userId+", items="+items+", logs="+logs+...}";// 如果 items 有 1000 条,toString() 极其耗时}

现象:生产环境日志量暴增,CPU 占用升高,接口响应变慢。


二、踩坑现场

场景 1:toString() 里有集合字段

// ❌ 危险:toString() 里打印了 List@ToStringclassOrder{privateLongid;privateList<OrderItem>items;// 可能 1000 条privateList<OrderLog>logs;// 可能 500 条}

log.info("订单:{}", order)→ 触发order.toString()→ 拼接 1500 条子对象的toString()→ 一次日志耗时 500ms。

场景 2:敏感信息打印到日志

// ❌ 危险:用户密码、Token 打印到日志log.info("用户登录:{}",user);// user.toString() 包含 password

三、正确写法

3.1 只打印关键字段

// ✅ 正确:只打印关键字段log.info("处理订单:orderId={}, userId={}",order.getId(),order.getUserId());

3.2 用 Lombok @ToString 排除大字段

// ✅ 正确:排除大字段@ToString(exclude={"items","logs"})classOrder{privateLongid;@ToString.Exclude// Lombok 新版本privateList<OrderItem>items;}

3.3 敏感字段不打印

// ✅ 正确:敏感字段用 @ToString.Exclude 排除@ToStringclassUser{privateLongid;@ToString.Exclude// 排除 passwordprivateStringpassword;privateStringname;}

3.4 JSON 打印(需控制深度)

// ✅ 需要打印对象时,用 JSON 且排除敏感字段log.info("订单:{}",JsonUtils.toJson(order,"password","token"));

四、最佳实践

✅ 日志打印的 5 条铁律

  1. 不要直接打印整个对象,只打印关键字段
  2. @ToString排除大字段和集合字段
  3. 敏感字段(passwordtoken)必须排除
  4. 日志里不要用字符串拼接+),用占位符({}
  5. 生产环境关闭 DEBUG 日志(只开 INFO/WARN)

🔍 Lombok @ToString 配置

@ToString(exclude={"items","logs"},// 排除字段callSuper=false,// 不打印父类字段includeFieldNames=true// 打印字段名)classOrder{...}

五、小结

  • log.info("{}", obj)会触发obj.toString(),如果toString()拼接大字段,高并发下性能雪崩
  • 只打印关键字段,不要直接打印整个对象
  • @ToString排除大字段和集合字段
  • 敏感字段必须排除,防止泄露
  • 生产环境只开 INFO/WARN,关闭 DEBUG

下一篇预告:用 switch 忘了写 break?Java 14 之后有更好的写法—— 穿透问题(fall-through)是 C 语言遗留的设计,Java 14 的 switch 表达式彻底解决了它。

更多资料一线大厂Java面试题合集

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/15 20:19:32

基于Python+爬虫的房屋租赁数据可视化系统设计与实现

&#x1f497;博主介绍&#xff1a;✌全网粉丝20W,CSDN全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云等平台优质作者,计算机毕设实战导师。目前专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌ &#x1f497;主要服务内…

作者头像 李华
网站建设 2026/7/15 20:16:35

数据科学项目失败的五大执行断点与防御体系

1. 项目概述&#xff1a;为什么这五个错误会直接拖垮数据科学项目“Avoid These Top 5 Mistakes in Data Science Projects”——这个标题乍看像一篇泛泛而谈的职场软文&#xff0c;但在我带过37个跨行业数据科学落地项目&#xff08;从制造业设备预测性维护到连锁药店销量归因…

作者头像 李华
网站建设 2026/7/15 20:16:32

YOLOv8改进策略【Neck】| CVPR2025 LCA轻量交叉注意力 跨层级双向引导 + 分层降噪增强,提升微小目标特征表达

一、本文介绍 本文记录的是利用LCA轻量交叉注意力改进YOLOv8的颈部融合部分。 LCA(Lighten Cross-Attention)通过对称双向交叉注意力块、浅层细节优化层CD与深层语义增强层IEL协同结合,搭建单模态浅层纹理、深层语义双向引导交互通路,实现跨层级特征信息互通互补。本文利…

作者头像 李华
网站建设 2026/7/15 20:13:49

VC++经典项目解析:从Windows底层到现代C++的工程实践

1. 项目概述与学习价值如果你是一名C开发者&#xff0c;尤其是深耕于Windows桌面应用、企业级软件或遗留系统维护的工程师&#xff0c;那么“VC”这三个字对你而言&#xff0c;绝不仅仅是一个编译器或IDE的名字&#xff0c;它代表着一个时代的技术栈、一套成熟的开发范式&#…

作者头像 李华
网站建设 2026/7/15 20:13:39

多分类混淆矩阵与TP/FP/FN/TN逐类计算原理

1. 项目概述&#xff1a;多分类场景下混淆矩阵与核心指标的完整计算逻辑在实际建模工作中&#xff0c;我经常被问到一个问题&#xff1a;“模型在测试集上到底表现如何&#xff1f;”——但很多人一上来就只盯着准确率&#xff08;Accuracy&#xff09;看&#xff0c;结果上线后…

作者头像 李华
网站建设 2026/7/15 20:12:40

HarmonyOS7 ArkUI 实战:ImageFit 填充模式、圆角头像与滤镜效果

文章目录前言代码讲解页面入口怎么安排数据模型先稳住状态变量控制页面反馈布局代码不要从样式开始读Builder 和方法承担复用使用方式完整代码关键代码解析interface 不是摆设State 是交互的开关列表和卡片要靠数据驱动事件回调要短一点样式参数别急着抽常量总结前言 图片展示…

作者头像 李华