Golang日志库slog-multi的实用技巧分享
Golang日志库slog-multi的实用技巧分享
这不是我的项目,而是我昨天偶然发现的一个非常实用的工具。它叫做 slog-multi,可以在 GitHub 上找到。其介绍将其描述为:“设计 slog 处理器的工作流:管道、中间件、扇出、路由、故障转移、负载均衡……”
它的功能远超出我的需求,但我的使用场景是需要同时将日志输出到标准输出和一个日志文件。此外,我在标准输出上使用了一个名为 tint 的自定义日志处理器来为输出着色。这些颜色信息是我不希望出现在日志文件中的。slog-multi 让我能够处理所有这些日志的特殊情况,为原本就很棒的 slog 包增加了极大的灵活性。
更多关于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("这是一条错误日志")
}
这个配置会:
- 在控制台输出带颜色的日志(通过
tint处理器) - 在
app.log文件中输出无颜色的 JSON 格式日志 - 两个输出可以设置不同的日志级别(如示例中控制台显示 Debug 及以上,文件只记录 Info 及以上)
slog-multi 还支持更复杂的场景,比如根据日志级别路由到不同的处理器:
handler := slogmulti.Router().
Add(slog.LevelError, slog.NewJSONHandler(logFile, nil)).
Add(slog.LevelDebug, tint.NewHandler(os.Stdout, &tint.Options{})).
Build()
这样可以将错误日志单独记录到文件,而调试信息只输出到控制台。

