golang 库 log/slog 介绍

发布时间: 更新时间: 总字数:730 阅读时间:2m 作者: IP上海 分享 网址

Go 1.21 标准库新增的 log/slog 包是专为结构化日志设计的高效工具,以下是简明使用指南:

核心优势

  1. 结构化输出 原生支持键值对(key-value)格式,可输出为易解析的 JSON 或易读的文本格式
  2. 分级日志 提供 4 个标准级别(Debug/Info/Warn/Error),支持自定义级别
  3. 高性能设计 通过减少内存分配和高效的类型处理优化性能
  4. 灵活扩展 允许自定义日志格式、输出目标和属性处理逻辑

基础使用

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"}

实用技巧

  1. 统一属性 使用 With() 添加全局字段:

    reqLogger := logger.With("request_id", "abcd-1234")
    reqLogger.Warn("API响应慢", "duration", 4500)
    
  2. 日志分组 嵌套相关字段:

    logger.Info("磁盘信息",
        slog.Group("disk",
            "total", 512000,
            "used", 127000,
        ))
    
  3. 自定义级别

    const LevelTrace = slog.Level(-8)
    logger.Log(nil, LevelTrace, "详细调试信息")
    

性能建议

  • 使用 LogAttrs 代替 Info 可减少内存分配
  • 避免高频日志路径中昂贵的属性计算
  • 对于敏感信息实现替换过滤器

适用场景

  • 需要对接日志分析系统(如 ELK)
  • 微服务架构中的分布式追踪
  • 需要自动化日志处理的场景

旧版本 Go 可通过 golang.org/x/exp/slog 体验该功能。该库提供了现代日志系统所需的核心功能,建议新项目优先考虑使用。

Home Archives Categories Tags Statistics
本文总阅读量 次 本站总访问量 次 本站总访客数