[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"blog-post-log-writing-standards-zh-CN":3,"blog-adjacent-log-writing-standards-zh-CN":29,"blog-related-log-writing-standards-zh-CN":65},{"id":4,"slug":5,"title":6,"excerpt":7,"content":8,"cover":9,"tone":10,"author":11,"publishedAt":12,"updatedAt":12,"readingMinutes":13,"featured":14,"tags":15,"category":19,"seoSettings":28},49,"log-writing-standards","日志规范：三个月后还能看懂","日志写给未来的同事看，也写给凌晨三点的自己看。结构化是底线。","\u003Cp>排查线上问题时，最难处理的不是没有日志，而是日志看不懂：只有一句“处理失败”，没有请求号，没有参数，也没有上下文。我们因此定了一份简单的日志规范。\u003C\u002Fp>\n\u003Ch2>四条约定\u003C\u002Fh2>\n\u003Cp>每条日志包含时间、级别、模块、请求号和关键参数，用统一字段格式输出。\u003C\u002Fp>\n\u003Cp>错误日志必须带堆栈和可定位的业务标识，比如订单号或客户编号，而不是内部自增主键。\u003C\u002Fp>\n\u003Cp>不要在循环里打大量日志，用汇总替代，避免把磁盘写满。\u003C\u002Fp>\n\u003Cp>敏感信息脱敏：手机号、身份证号、支付信息一律不落明文。\u003C\u002Fp>\n\u003Ch2>分级要克制\u003C\u002Fh2>\n\u003Cp>INFO 用于关键业务节点，WARN 用于可恢复的异常，ERROR 用于需要人介入的问题。\u003C\u002Fp>\n\u003Cp>如果 ERROR 每天出现上百条，说明分级失效了，团队会对告警麻木。\u003C\u002Fp>\n\u003Cp>上线前检查一遍日志输出，确保关键路径都有记录，而不是靠事后再加。\u003C\u002Fp>\n\u003Cp>好的日志让排查从几小时缩短到几分钟。它是最便宜的可观测性投入。\u003C\u002Fp>","","slate","佳益方圆团队","2026-03-03T12:07:00+08:00",1,false,[16,17,18],"日志","规范","工程实践",{"id":13,"parentId":20,"slug":21,"name":22,"description":23,"icon":24,"cover":9,"tone":25,"kind":26,"sortOrder":27,"count":20},0,"engineering","技术专栏","架构设计、性能优化、AI 集成与跨端方案等一线技术实践，由研发团队持续分享。","cpu","blue","article",60,{},{"previous":30,"next":48},{"id":31,"slug":32,"title":33,"excerpt":34,"content":9,"cover":9,"tone":35,"author":11,"publishedAt":36,"updatedAt":36,"readingMinutes":13,"featured":14,"tags":37,"category":41},28,"the-quote-line-nobody-reads","报价单上最容易被忽略的一行","“不含第三方费用”这句话，替我们避免了很多次扯皮。","indigo","2026-03-05T11:54:00+08:00",[38,39,40],"创业","报价","合同",{"id":42,"parentId":20,"slug":43,"name":44,"description":45,"icon":46,"cover":9,"tone":25,"kind":26,"sortOrder":47,"count":20},6,"founder-notes","创业手记","创始团队在经营、管理与产品上的思考，记录一家软件公司的成长过程。","pen-tool",10,{"id":49,"slug":50,"title":51,"excerpt":52,"content":9,"cover":9,"tone":10,"author":11,"publishedAt":53,"updatedAt":53,"readingMinutes":13,"featured":14,"tags":54,"category":58},69,"search-in-admin","后台搜索该怎么做","搜索框人人会放，真正难的是让搜索结果符合用户找数据的方式。","2026-03-01T12:07:00+08:00",[55,56,57],"搜索","后台","产品设计",{"id":59,"parentId":20,"slug":60,"name":61,"description":62,"icon":63,"cover":9,"tone":25,"kind":26,"sortOrder":64,"count":20},2,"product-thinking","产品思维","需求分析、用户体验与产品设计方法论，以及从业务问题到产品方案的思考过程。","lightbulb",50,[66,77,88],{"id":67,"slug":68,"title":69,"excerpt":70,"content":9,"cover":9,"tone":71,"author":11,"publishedAt":72,"updatedAt":72,"readingMinutes":13,"featured":14,"tags":73,"category":76},30,"integration-api-pitfalls","企业系统集成：接口对接最容易踩的五个坑","接口文档写得再全，真正对接时仍然会卡在字段约定、超时和重复推送这些细节上。","cyan","2026-10-17T09:00:00+08:00",[74,75,18],"系统集成","接口",{"id":13,"parentId":20,"slug":21,"name":22,"description":23,"icon":24,"cover":9,"tone":25,"kind":26,"sortOrder":27,"count":20},{"id":13,"slug":78,"title":79,"excerpt":80,"content":9,"cover":9,"tone":71,"author":11,"publishedAt":81,"updatedAt":82,"readingMinutes":59,"featured":83,"tags":84,"category":87},"why-enterprise-systems-age","为什么企业系统会在三年后开始“老化”","系统上线时功能齐全，三年后却处处别扭。问题往往不在代码，而在交付时被忽略的那些变化。","2026-10-16T09:30:00+08:00","2026-10-18T15:58:14.648+08:00",true,[85,86],"系统演进","架构设计",{"id":13,"parentId":20,"slug":21,"name":22,"description":23,"icon":24,"cover":9,"tone":25,"kind":26,"sortOrder":27,"count":20},{"id":89,"slug":90,"title":91,"excerpt":92,"content":9,"cover":9,"tone":25,"author":11,"publishedAt":93,"updatedAt":93,"readingMinutes":13,"featured":14,"tags":94,"category":98},31,"idempotent-design-basics","幂等设计：重复提交不只是用户手抖","网络重试、消息重投、用户连点，都会让同一个请求到达多次。幂等应该设计在接口里。","2026-10-05T10:13:00+08:00",[95,96,97],"接口设计","幂等","可靠性",{"id":13,"parentId":20,"slug":21,"name":22,"description":23,"icon":24,"cover":9,"tone":25,"kind":26,"sortOrder":27,"count":20}]