Go 1.21 标准库新增的 log/slog
包是专为结构化日志设计的高效工具,以下是简明使用指南:
核心优势
- 结构化输出
原生支持键值对(key-value)格式,可输出为易解析的 JSON 或易读的文本格式
- 分级日志
提供 4 个标准级别(Debug/Info/Warn/Error),支持自定义级别
- 高性能设计
通过减少内存分配和高效的类型处理优化性能
- 灵活扩展
允许自定义日志格式、输出目标和属性处理逻辑
基础使用
import "log/slog"
func main() {
// 默认文本格式输出
slog.Info("用户登录", "userid", 123, "ip", "192.168.1.1")
// 输出示例:
// 2023/10/01 10:00 INFO 用户登录 userid=123 ip=192.168.1.1
}
进阶配置
// 创建 JSON 格式的 logger
logger := slog.New(slog.NewJSONHandler(os.Stdout, &slog.HandlerOptions{
Level: slog.LevelDebug, // 设置记录级别
}))
// 记录带上下文的日志
logger.LogAttrs(context.Background(), slog.LevelInfo, "支付成功",
slog.Int("amount", 5990),
slog.String("currency", "CNY"),
)
// 输出结果:
// {"time":"2023-10-01T10:00:00Z","level":"INFO","msg":"支付成功","amount":5990,"currency":"CNY"}
实用技巧
统一属性
使用 With()
添加全局字段:
reqLogger := logger.With("request_id", "abcd-1234")
reqLogger.Warn("API响应慢", "duration", 4500)
日志分组
嵌套相关字段:
logger.Info("磁盘信息",
slog.Group("disk",
"total", 512000,
"used", 127000,
))
自定义级别
const LevelTrace = slog.Level(-8)
logger.Log(nil, LevelTrace, "详细调试信息")
性能建议
- 使用
LogAttrs
代替 Info
可减少内存分配 - 避免高频日志路径中昂贵的属性计算
- 对于敏感信息实现替换过滤器
适用场景
- 需要对接日志分析系统(如 ELK)
- 微服务架构中的分布式追踪
- 需要自动化日志处理的场景
旧版本 Go 可通过 golang.org/x/exp/slog
体验该功能。该库提供了现代日志系统所需的核心功能,建议新项目优先考虑使用。