

新闻资讯
技术学院Go 标准库 log 不支持原生日志级别,推荐使用 Go 1.21+ 内置 slog(轻量、结构化、着色输出),或高性能库如 zap/zerolog;兼容旧版可封装 log.Writer 并按级别分离输出目标与前缀。
Go 标准库的 log 包本身不支持日志级别(如 Info/Warn/Error)的原生区分,但通过简单封装或使用成熟日志库(如 log/slog(Go 1.21+ 内置)或 zap、zerolog),可以清晰、安全地实现多级别日志记录。关键在于:**用不同输出目标、前缀或结构化字段标识级别,并确保 Error 日志包含堆栈或上下文以便排查。**
slog 是官方维护的结构化日志包,天然支持日志级别、属性绑定和自定义处理器。
slog.Info、slog.Warn、slog.Error 直接区分,语义明确slog.String("user_id", "u123")、slog.Int("status", 500)
err 属性(slog.Any("err", err)),slog 会自动展开错误链和底层原因示例:
```go
log.Writer 封装(兼容老版本 Go)若暂不能升级到 Go 1.21,可用标准 log 包 + 前缀 + 不同输出器模拟多级别。
*log.Logger,设置不同前缀(如 "INFO "、"WARN "、"ERROR ")os.Stderr,Info/Warn 写入 os.Stdout,便于 shell 重定向分离debug.PrintStack() 或用 errors.WithStack(需第三方包)补充堆栈示例:
```go高并发、低延迟场景下,标准库和 slog 默认处理器可能有性能瓶颈。zap(Uber)和 zerolog(rs/zerolog)专为高性能设计:
zap.NewAsync)、日志轮转、JSON 输出,天然适配 ELK/Prometheus 生态logger.Error("db timeout", zap.String("query", q), zap.Duration("elapsed", d))
无论用哪个库,以下几点直接影响排障效率:
Debug 级别代替,上线时关闭slog.String("phone", "***"+last4))