Golang Slog日志输出配置

如何在Golang中使用slog包配置自定义日志输出?我尝试设置日志级别和输出格式,但发现日志输出不符合预期,比如时间格式不正确或日志级别筛选无效。能否提供一个完整的slog配置示例,包括如何设置JSON格式输出、自定义时间格式以及按不同级别(DEBUG/INFO/WARN等)过滤日志?另外,slog的性能开销如何,是否适合在高并发场景下使用?

2 回复

Golang标准库的slog支持JSON和文本格式输出。可通过SetDefault设置全局日志级别,使用HandlerOptions自定义时间格式和调用信息。示例:

logger := slog.New(slog.NewJSONHandler(os.Stdout, nil))
slog.SetDefault(logger)

更多关于Golang Slog日志输出配置的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


在Golang中,slog是标准库log/slog提供的结构化日志包。以下是常用配置示例:

1. 基础控制台输出

package main

import (
    "log/slog"
    "os"
)

func main() {
    // 默认JSON输出
    logger := slog.New(slog.NewJSONHandler(os.Stdout, nil))
    slog.SetDefault(logger)
    
    slog.Info("hello", "user", "john") // 输出结构化日志
}

2. 自定义配置

handler := slog.NewTextHandler(os.Stderr, &slog.HandlerOptions{
    Level:     slog.LevelDebug,    // 设置日志级别
    AddSource: true,               // 添加源文件信息
})
logger := slog.New(handler)
slog.SetDefault(logger)

3. 级别控制

// 动态级别设置
dynamicLevel := &slog.LevelVar{}
dynamicLevel.Set(slog.LevelInfo)

handler := slog.NewJSONHandler(os.Stdout, &slog.HandlerOptions{
    Level: dynamicLevel,
})
logger := slog.New(handler)

// 运行时修改级别
dynamicLevel.Set(slog.LevelDebug)

4. 自定义输出格式

type CustomHandler struct {
    slog.Handler
}

func (h *CustomHandler) Handle(ctx context.Context, r slog.Record) error {
    // 自定义格式:时间 | 级别 | 消息
    fmt.Printf("%s | %s | %s\n",
        r.Time.Format("2006-01-02 15:04:05"),
        r.Level,
        r.Message)
    return nil
}

handler := &CustomHandler{
    Handler: slog.NewJSONHandler(os.Stdout, nil),
}

5. 文件输出

file, _ := os.OpenFile("app.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)
logger := slog.New(slog.NewJSONHandler(file, &slog.HandlerOptions{
    Level: slog.LevelInfo,
}))

常用日志级别(从低到高):

  • Debug:调试信息
  • Info:常规信息
  • Warn:警告信息
  • Error:错误信息

通过合理配置HandlerOptions,可以灵活控制日志输出格式、级别和目标。

回到顶部