Golang Slog日志库
在使用Golang的slog日志库时,如何自定义日志的输出格式?比如我想让日志包含时间戳、日志级别和调用者信息,但默认的JSON格式不太符合需求。另外,slog的性能开销如何,相比zap或logrus这类第三方库有什么优势?
2 回复
Golang slog 是 Go 1.21 新增的结构化日志库,支持级别(Debug、Info、Warn、Error)和键值对输出。相比 log 包,slog 更易集成 JSON 格式和日志收集系统,适合现代应用开发。
更多关于Golang Slog日志库的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
Go 1.21 引入了新的结构化日志库 slog,作为 log/slog 包提供。它支持结构化、分级日志记录,比传统的 log 包更强大。
主要特性
- 结构化日志:支持键值对形式记录日志
- 日志级别:Debug、Info、Warn、Error
- 多种输出:支持文本和 JSON 格式
- 高性能:设计时考虑了性能优化
基本使用
package main
import (
"log/slog"
"os"
)
func main() {
// 文本格式输出
textLogger := slog.New(slog.NewTextHandler(os.Stdout, nil))
slog.SetDefault(textLogger)
slog.Info("用户登录", "user_id", 123, "ip", "192.168.1.1")
// JSON 格式输出
jsonLogger := slog.New(slog.NewJSONHandler(os.Stdout, nil))
slog.SetDefault(jsonLogger)
slog.Warn("磁盘空间不足", "usage", 95, "threshold", 90)
// 带级别的日志方法
slog.Debug("调试信息")
slog.Error("错误发生", "err", "文件不存在")
}
自定义配置
func main() {
// 自定义 Handler
handler := slog.NewJSONHandler(os.Stdout, &slog.HandlerOptions{
Level: slog.LevelDebug, // 设置日志级别
AddSource: true, // 添加源代码位置
})
logger := slog.New(handler)
// 使用 With 添加公共字段
logger = logger.With("app", "myapp", "version", "1.0.0")
logger.Info("应用启动")
logger.Error("处理失败", "request_id", "req-123")
}
日志级别控制
func main() {
handler := slog.NewJSONHandler(os.Stdout, &slog.HandlerOptions{
Level: slog.LevelWarn, // 只记录 Warn 及以上级别
})
logger := slog.New(handler)
logger.Debug("这条不会输出") // 被过滤
logger.Info("这条也不会输出") // 被过滤
logger.Warn("这条会输出") // 会输出
logger.Error("这条也会输出") // 会输出
}
性能优化技巧
- 避免在日志调用中执行复杂计算
- 使用
slog.Group分组字段 - 在 Debug 级别使用
slog.DebugContext
slog 是 Go 官方推荐的现代日志解决方案,适合新项目和重构现有日志系统。

