Golang日志库slog-multi的实用技巧分享

Golang日志库slog-multi的实用技巧分享 这不是我的项目,而是我昨天偶然发现的一个非常实用的工具。它叫做 slog-multi,可以在 GitHub 上找到。其介绍将其描述为:“设计 slog 处理器的工作流:管道、中间件、扇出、路由、故障转移、负载均衡……”

它的功能远超出我的需求,但我的使用场景是需要同时将日志输出到标准输出和一个日志文件。此外,我在标准输出上使用了一个名为 tint 的自定义日志处理器来为输出着色。这些颜色信息是我不希望出现在日志文件中的。slog-multi 让我能够处理所有这些日志的特殊情况,为原本就很棒的 slog 包增加了极大的灵活性。:+1:


更多关于Golang日志库slog-multi的实用技巧分享的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于Golang日志库slog-multi的实用技巧分享的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


slog-multi 确实是一个强大的工具,可以灵活地组合多个日志处理器。根据你的需求,这里是一个示例配置,将日志同时输出到标准输出(使用 tint 着色)和日志文件(无着色):

package main

import (
    "io"
    "log/slog"
    "os"

    "github.com/lmittmann/tint"
    "github.com/samber/slog-multi"
)

func main() {
    // 创建日志文件
    logFile, err := os.OpenFile("app.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)
    if err != nil {
        panic(err)
    }
    defer logFile.Close()

    // 创建两个处理器
    consoleHandler := tint.NewHandler(os.Stdout, &tint.Options{
        Level: slog.LevelDebug,
    })
    
    fileHandler := slog.NewJSONHandler(logFile, &slog.HandlerOptions{
        Level: slog.LevelInfo,
    })

    // 使用 Fanout 同时输出到两个处理器
    handler := slogmulti.Fanout(consoleHandler, fileHandler)

    // 设置默认日志处理器
    slog.SetDefault(slog.New(handler))

    // 测试日志输出
    slog.Info("这是一条信息日志")
    slog.Error("这是一条错误日志")
}

这个配置会:

  1. 在控制台输出带颜色的日志(通过 tint 处理器)
  2. app.log 文件中输出无颜色的 JSON 格式日志
  3. 两个输出可以设置不同的日志级别(如示例中控制台显示 Debug 及以上,文件只记录 Info 及以上)

slog-multi 还支持更复杂的场景,比如根据日志级别路由到不同的处理器:

handler := slogmulti.Router().
    Add(slog.LevelError, slog.NewJSONHandler(logFile, nil)).
    Add(slog.LevelDebug, tint.NewHandler(os.Stdout, &tint.Options{})).
    Build()

这样可以将错误日志单独记录到文件,而调试信息只输出到控制台。

回到顶部