Golang Slog日志库使用指南

最近在学习Golang的slog日志库,但在实际使用中遇到几个问题:1)如何配置slog输出JSON格式的日志?2)slog支持哪些日志级别,如何自定义日志级别?3)怎样为slog添加自定义的日志字段?4)slog的性能如何,在高并发场景下需要注意什么?5)能否结合zerolog或zap使用?希望有经验的朋友能分享一下最佳实践。

2 回复

Golang slog是Go 1.21引入的结构化日志库。使用步骤:

  1. 导入log/slog
  2. 创建Logger:slog.New(slog.NewTextHandler(os.Stdout, nil))
  3. 记录日志:slog.Info("消息", "key", "value")

支持级别(Debug/Info/Warn/Error)和结构化输出,可自定义Handler处理不同格式和输出目标。

更多关于Golang Slog日志库使用指南的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


Golang Slog 日志库使用指南

log/slog 是 Go 1.21 引入的结构化日志库,提供高性能的键值对日志记录。

基本使用

package main

import (
    "log/slog"
    "os"
)

func main() {
    // 默认文本格式输出到标准错误
    logger := slog.New(slog.NewTextHandler(os.Stderr, nil))
    
    // 记录结构化日志
    logger.Info("用户登录",
        "user_id", 123,
        "ip", "192.168.1.100",
        "success", true)
    
    // 使用 With 添加公共字段
    userLogger := logger.With("user_id", 123)
    userLogger.Warn("操作失败", "action", "update_profile")
}

配置选项

// JSON 格式输出
logger := slog.New(slog.NewJSONHandler(os.Stdout, &slog.HandlerOptions{
    Level: slog.LevelDebug, // 设置日志级别
    AddSource: true,        // 添加源文件信息
}))

// 自定义级别
logger.Debug("调试信息")
logger.Info("普通信息")
logger.Warn("警告信息")
logger.Error("错误信息")

高级特性

// 使用 Attr 提高性能
logger.Info("用户操作",
    slog.Int("user_id", 123),
    slog.String("action", "purchase"),
    slog.Group("order",
        slog.String("id", "ORD-001"),
        slog.Float64("amount", 99.99)))

// 自定义日志级别
const LevelTrace = slog.Level(-8)
logger.Log(nil, LevelTrace, "跟踪信息")

全局设置

// 设置默认 logger
slog.SetDefault(logger)

// 全局使用
slog.Info("全局日志记录", "service", "api")

最佳实践

  1. 性能考虑:使用 slog.Attr 而非键值对参数
  2. 错误处理:结合 error 类型记录错误
  3. 上下文:使用 context 传递请求相关字段
  4. 级别管理:生产环境使用 LevelInfo 或更高
func handleRequest(ctx context.Context, userID int) {
    logger := slog.Default().With(
        "request_id", ctx.Value("request_id"),
        "user_id", userID,
    )
    
    logger.Info("请求处理开始")
    defer logger.Info("请求处理结束")
}

slog 提供了比标准库更强大的结构化日志功能,适合现代应用开发需求。

回到顶部