关键在于日志取舍而非压榨:通过配置规则实现精准留痕,关闭冗余元数据、禁用位置信息与全栈跟踪、采用结构化异步批量输出、分级日志策略及敏感字段自动脱敏。

关键不在“压榨”,而在“取舍”——用明确的配置规则把日志从“全量记录”变成“精准留痕”,既不丢关键线索,也不拖慢系统。
关掉冗余元数据,省下IO和CPU
生产环境里最常被忽略的性能开销,来自日志里那些看似有用、实则低价值的附加信息。比如文件路径、行号、调用栈深度等,在排查时极少被人工查阅,却在每次写入时触发字符串拼接、堆栈遍历和磁盘刷写。
- 启用 hideLogPositionForProduction: true(如 tslog)或等效配置(如 log4j2 的
%highlight{%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n}中移除%class:%line),自动屏蔽位置信息 - 禁用默认的 full stack trace 输出,仅在 error 级别且
error.cause非空时才展开根因栈 - 避免在日志语句中拼接 JSON 对象或大数组,改用结构化字段(如
logger.info("user login", { userId, ip, duration }))让序列化由日志库异步完成
按场景分级输出,让日志“该重时重、该轻时轻”
不是所有请求都需要同等粒度的日志。高频接口(如健康检查、静态资源)可只记 warn/error;核心链路(如支付、下单)则保留 trace-id、耗时、关键参数快照。
- 用 MDC(Mapped Diagnostic Context)注入统一 traceId、userId、reqId,替代每条日志手动拼接
- 对非核心路径(如 /health、/metrics)设置独立 logger 实例,并将 minLevel 强制设为 warn 或更高
- 在网关或拦截器层识别“调试流量”(如带
X-Debug: true头),临时提升该请求链路的日志级别,不扰动全局配置
结构化 + 异步 + 批量,绕过同步写入瓶颈
同步刷盘是高并发下响应延迟的隐形推手。结构化日志本身不提速,但它是后续异步化、批量压缩、远程传输的前提。
- 强制使用 JSON 格式输出(而非自由文本),确保字段名固定、值类型可控,便于后续解析与索引
- 启用日志框架的异步 appender(如 logback 的
AsyncAppender,或 pino 的pino.destination()流式写入) - 设置合理的 buffer size 和 flush interval(例如 8KB / 100ms),平衡延迟与吞吐,避免小包频繁刷盘
敏感字段自动脱敏,避免合规反噬性能
明文记录手机号、token、密码等,不仅违规,还会因正则扫描、加解密、审计拦截等额外处理拖慢主线程。
- 在日志框架层配置字段级脱敏规则(如 log4j2 的
RegexLayout+ 自定义 Pattern,或使用MaskingPatternLayout) - 禁止在日志中直接打印
request.body或exception.toString(),改用白名单字段提取 - 对已知敏感键名(如 "password"、"auth_token"、"id_card")做统一拦截,值统一替换为
[REDACTED]










