瞧瞧别人家的日志打印,那叫一个优雅!

前言

这篇文章跟大家一起聊聊打印优雅日志的10条军规,希望对你会有所帮助。

第1条:格式统一

反例(管理看到会扣钱)

log.info("start process"); log.error("error happen");

无时间戳,无上下文。

正解代码

<!-- logback.xml核心配置 --> <pattern> %d{yy-MM-dd HH:mm:ss.SSS} |%X{traceId:-NO_ID} |%thread |%-5level |%logger{36} |%msg%n </pattern>

在logback.xml中统一配置了日志的时间格式、tradeId,线程、等级、日志详情都信息。

日志的格式统一了,更方便点位问题。

第2条:异常必带堆栈

反例(同事看了想打人)

try { processOrder(); } catch (Exception e) { log.error("处理失败"); }

出现异常了,日志中没打印任何的异常堆栈信息。

相当于自己把异常吃掉了。

非常不好排查问题。

正确姿势

log.error("订单处理异常 orderId={}", orderId, e); // e必须存在!

日志中记录了出现异常的订单号orderId和异常的堆栈信息e。

第3条:级别合理

反面教材

log.debug("用户余额不足 userId={}", userId); // 业务异常应属WARN log.error("接口响应稍慢"); // 普通超时属INFO

接口响应稍慢,打印了error级别的日志,显然不太合理。

正常情况下,普通超时属INFO级别。

级别定义表

级别

正确使用场景

FATAL

系统即将崩溃(OOM、磁盘爆满)

ERROR

核心业务失败(支付失败、订单创建异常)

WARN

可恢复异常(重试成功、降级触发)

INFO

关键流程节点(订单状态变更)

DEBUG

调试信息(参数流水、中间结果)

第4条:参数完整

反例(让运维骂娘)

log.info("用户登录失败");

上面这个日志只打印了“用户登录失败”这个文案。

谁在哪登录失败?

侦探式日志

log.warn("用户登录失败 username={}, clientIP={}, failReason={}", username, clientIP, "密码错误次数超限");

登录失败的业务场景,需要记录哪个用户,ip是多少,在什么时间,登录失败了,失败的原因是什么。

时间在logback.xml中统一配置了格式。

这样才方便快速定位问题:

第5条:数据脱敏

血泪案例
某同事打印日志泄露用户手机号被投诉。

我在记录的日志中,需要对一下用户的个人敏感数据做脱敏处理。

例如下面这样:

// 脱敏工具类 public class LogMasker { public static String maskMobile(String mobile) { return mobile.replaceAll("(\\d{3})\\d{4}(\\d{4})", "$1****$2"); } } // 使用示例 log.info("用户注册 mobile={}", LogMasker.maskMobile("13812345678"));

第6条:异步保性能

问题复现
某次秒杀活动中直接同步写日志,导致大量线程阻塞:

log.info("秒杀请求 userId={}, itemId={}", userId, itemId);

高并发下IO阻塞。

致命伤害分析:

  1. 同步写日志导致线程上下文切换频繁

  2. 磁盘IO成为系统瓶颈

  3. 高峰期日志打印耗时占总RT的25%

正确示范(三步配置法)

步骤1:logback.xml配置异步通道

<!-- 异步Appender核心配置 --> <appender name="ASYNC" class="ch.qos.logback.classic.AsyncAppender"> <!-- 不丢失日志的阈值:当队列剩余容量<此值时,TRACE/DEBUG级别日志将被丢弃 --> <discardingThreshold>0</discardingThreshold> <!-- 队列深度:建议设为 (最大并发线程数 × 2) --> <queueSize>4096</queueSize> <!-- 关联真实Appender --> <appender-ref ref="FILE"/> </appender>

步骤2:日志输出优化代码

// 无需前置判断,框架自动处理 log.debug("接收到MQ消息:{}", msg.toSimpleString()); // 自动异步写入队列 // 不应做复杂计算后再打印(异步前仍在业务线程执行) // 错误做法: log.debug("详细内容:{}", computeExpensiveLog());

流程图如下:

步骤3:性能关键参数公式

最大内存占用 ≈ 队列长度 × 平均单条日志大小 推荐队列深度 = 峰值TPS × 容忍最大延迟(秒) 例如:10000 TPS × 0.5s容忍 ⇒ 5000队列大小

风险规避策略

  1. 防队列堆积:监控队列使用率,达80%触发告警

  2. 防OOM:严格约束大对象toString()的调用

  3. 紧急逃生:预设JMX接口用于快速切换同步模式

第7条:链路追踪

混沌场景
跨服务调用无法关联日志。

我们需要有链路追踪方案。

全链路方案

// 拦截器注入traceId MDC.put("traceId", UUID.randomUUID().toString().substring(0,8)); // 日志格式包含traceId <pattern>%d{HH:mm:ss} |%X{traceId}| %msg%n</pattern>

可以在MDC中设置traceId。

后面可以通过traceId全链路追踪日志。

流程图如下:

第8条:动态调参

半夜重启的痛
线上问题需要临时开DEBUG日志,比如:查询用户的某次异常操作的日志。

热更新方案

@GetMapping("/logLevel") public String changeLogLevel( @RequestParam String loggerName, @RequestParam String level) { Logger logger = (Logger) LoggerFactory.getLogger(loggerName); logger.setLevel(Level.valueOf(level)); // 立即生效 return "OK"; }

有时候我们需要临时打印DEBUG日志,这就需要有个动态参数控制了。

否则每次调整打印日志级别都需要重启服务,可能会影响用户的正常使用。

journey title 日志级别动态调整 section 旧模式 发现问题 --> 修改配置 --> 重启应用 --> 丢失现场 section 新模式 发现问题 --> 动态调整 --> 立即生效 --> 保持现场

第9条:结构化存储

混沌日志

用户购买了苹果手机 订单号1001 金额8999

上面的日志拼接成了一个字符串,虽说中间有空格分隔了,但哪些字段对应了哪些值,看起来不是很清楚。

我们在存储日志的时候,需要做结构化存储,方便快速的查询和搜索。

机器友好式日志

{ "event": "ORDER_CREATE", "orderId": 1001, "amount": 8999, "products": [{"name":"iPhone", "sku": "A123"}] }

这里使用了json格式存储日志。

日志中的数据一目了然。

第10条:智能监控

最失败案例
某次用户开通会员操作,错误日志堆积3天才被发现,黄花菜都凉了。

我们需要在项目中引入智能监控。

ELK监控方案

报警规则示例

ERROR日志连续5分钟 > 100条 → 电话告警 WARN日志持续1小时 → 邮件通知

总结

研发人员的三大境界

  1. 青铜System.out.println("error!")

  2. 钻石:标准化日志 + ELK监控

  3. 王者

    • 日志驱动代码优化

    • 异常预测系统

    • 根因分析AI模型

最后的灵魂拷问
下次线上故障时,你的日志能让新人5分钟定位问题吗?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1200676.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java_ssm6专门体检预约管理系统_idea项目源码

目录具体实现截图系统概述技术架构核心功能模块数据库设计项目亮点系统所用技术介绍写作提纲源码文档获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;具体实现截图 系统概述 Java_SSM6专门体检预约管理系统基于SpringSpringMVCMyBatis&#xf…

[特殊字符] 栈与队列基础知识全面解析

一、栈(Stack)理论基础 1.1 栈的基本特性 栈是一种后进先出(LIFO, Last In First Out) 的数据结构,操作只在栈顶进行。 // 栈的基本操作 stack<int> st; st.push(1); // 入栈 st.push(2); int top = st.top(); // 查看栈顶元素:2 st.pop(); // 出栈,…

医疗器械包装运输验证标准:GB/T4857系列标准

一、GB/T 4857系列核心测试标准解析 GB/T 4857《包装 运输包装件基本试验》系列标准涵盖23个部分&#xff0c;针对医疗器械运输场景&#xff0c;以下核心标准构成了全方位的测试体系&#xff1a; &#xff08;一&#xff09;冲击类试验&#xff1a;模拟碰撞风险 跌落试验&am…

java_ssm7特产农产品网上商城的设计与实现_idea项目源码

目录 具体实现截图项目背景与意义技术架构核心功能模块创新点与优势应用价值 系统所用技术介绍写作提纲源码文档获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01; 具体实现截图 项目背景与意义 随着互联网技术的发展和农村电商的兴起&#xff0…

java_ssm115计算机系统在线考试平台_idea项目源码

目录 具体实现截图计算机系统在线考试平台摘要 系统所用技术介绍写作提纲源码文档获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01; 具体实现截图 计算机系统在线考试平台摘要 该在线考试平台基于Java SSM框架&#xff08;SpringSpring MVCMyBa…

java_ssm8中药中草药商城 供求信息管理系统_idea项目源码

目录 具体实现截图项目背景与目标技术架构核心功能模块创新与优势适用场景总结 系统所用技术介绍写作提纲源码文档获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01; 具体实现截图 项目背景与目标 中药中草药商城供求信息管理系统基于Java SSM框…

小迪安全2023-2024|第102天:漏洞发现-漏扫项目篇Poc开发Yaml语法插件一键生成匹配结_笔记|web安全|渗透测试|

第102天&#xff1a;漏洞发现-漏扫项目篇&Poc开发&Yaml语法&插件一键生成&匹配结_笔记 一、漏洞发现—漏扫项目篇&#xfeff;00:15 1. 漏洞扫描工具分类&#xfeff;01:50 综合类工具&#xff1a; BurpSuite&#xff1a;集成化Web应用测试平台&#xff0c;…

C++中string与char的全面解析

一、char(字符) 1.1 基本概念 char 是C++中的基本数据类型,用于表示单个字符。 char c = A; // 单个字符用单引号 char zero = 0; // 字符0,ASCII值为48 char space = ; // 空格字符 char newline = \n; // 转义字符1.2 重要特性 大小:通常1字节(8位)…

如何搭建自动化测试框架?

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 最近好多小伙伴都在说接口自动化测试&#xff0c;那么究竟什么是接口自动化测试呢&#xff1f;让我们一起往下看就知道了&#xff0c;首先我们得先弄清楚下面这…

从Java基础到微服务架构:互联网大厂面试三轮问答实录

从Java基础到微服务架构&#xff1a;互联网大厂面试三轮问答实录 第一轮&#xff1a;核心语言与平台基础 面试官问&#xff1a; Java中HashMap的底层实现原理是什么&#xff1f;JVM如何进行内存管理&#xff1f;能简单介绍下主要的内存区域吗&#xff1f;在Java中&#xff0c;如…

java_ssm2家用二手电器回收系统

目录具体实现截图家用二手电器回收系统摘要系统所用技术介绍写作提纲源码文档获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;具体实现截图 家用二手电器回收系统摘要 随着电子产品更新迭代速度加快&#xff0c;大量二手电器被闲置或废弃&…

java_ssm116课程在线学习评测教学系统智慧学伴服务平台开发_idea项目源码

目录具体实现截图项目概述核心功能技术架构创新点应用价值系统所用技术介绍写作提纲源码文档获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;具体实现截图 项目概述 Java_SSM116课程在线学习评测教学系统智慧学伴服务平台是一个基于SSM&#x…

EasyGBS打造智慧机场一体化智能监管体系

在航空运输业高速发展与智慧化转型的时代背景下&#xff0c;机场作为连接空中与地面的关键枢纽&#xff0c;其运营安全、效率和服务质量面临着前所未有的高标准要求。传统机场监控系统普遍存在“信息孤岛”、智能化程度不足、应急响应滞后等痛点。在这一背景下&#xff0c;Easy…

2026年北京周边诚信的加湿系统专业加盟公司,如何选择?

2026年健康家居市场持续升温,加湿系统作为改善室内环境、提升居住舒适度的核心设备,其加盟赛道也迎来爆发式增长。无论是解决白粉污染、微生物滋生等用户痛点的创新技术,还是覆盖住宅、商业、医疗等多场景的解决方案…

java_ssm3Web的篮球CBA联赛信息管理系统

目录具体实现截图篮球CBA联赛信息管理系统摘要系统所用技术介绍写作提纲源码文档获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;具体实现截图 篮球CBA联赛信息管理系统摘要 该系统基于Java SSM&#xff08;SpringSpringMVCMyBatis&#xff09…

2026年资质齐全的专升本辅导机构,哈尔滨共创专升本值得关注!

本榜单依托全维度行业调研与真实学员口碑,深度筛选出五家黑龙江省医学专升本领域标杆机构,为医学类专科生选型提供客观依据,助力精准匹配适配的升本辅导伙伴。 TOP1 推荐:哈尔滨共创教育信息咨询有限公司 推荐指数…

java_ssm117超市在线配送管理系统_idea项目源码

目录具体实现截图项目概述核心功能模块技术实现项目亮点系统所用技术介绍写作提纲源码文档获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;具体实现截图 项目概述 Java_SSM117超市在线配送管理系统是一款基于SSM&#xff08;SpringSpringMVCMy…

java_ssm1 高校学生班费管理系统

目录具体实现截图高校学生班费管理系统摘要系统所用技术介绍写作提纲源码文档获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;具体实现截图 高校学生班费管理系统摘要 高校学生班费管理系统基于Java SSM框架&#xff08;SpringSpring MVCMyBat…

三星岩意奢岩板专业吗,从工艺到服务全面探究

在当代人居与商业空间的美学构建中,高品质岩板已成为连接设计构想与空间现实的关键纽带。面对市场上品质波动、交付不稳与设计局限的痛点,如何选择专业且的岩板品牌?以下结合不同需求维度,为你推荐5家靠谱的岩板品…

java_ssm10乡村小学校园官网_idea项目源码

目录 具体实现截图项目概述核心功能模块技术实现亮点部署与扩展性 系统所用技术介绍写作提纲源码文档获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01; 具体实现截图 项目概述 该项目是基于Java SSM框架&#xff08;SpringSpringMVCMyBatis&…