# go日志记录解决方案
# 简单桌面应用日志解决方案
slog package - log/slog - Go Packages (opens new window)
slog 是 Go 语言官方标准库中的一个包,全称是 log/slog。它从 Go 1.21 版本(2023年8月发布)开始引入,旨在为 Go 程序提供一个高性能、结构化、分级别的现代日志解决方案。
简单来说,你可以把它理解为 官方版的“结构化日志库”,类似于第三方库 logrus 或 zap,但具有以下特点:
slog 的核心特点
- 结构化日志
日志不再是单纯的字符串,而是包含键值对字段,便于机器解析和检索。
例如:
slog.Info("user login", "uid", 12345, "ip", "192.168.1.1")输出可以是 JSON 格式:{"time":"...","level":"INFO","msg":"user login","uid":12345,"ip":"192.168.1.1"} - 日志级别
内置
Debug、Info、Warn、Error四个级别,可通过HandlerOptions灵活控制输出级别。 - 高性能
设计上避免了反射和大量内存分配,性能远高于
logrus,接近zap。 - 上下文支持
提供了
InfoContext、DebugContext等方法,可以将context.Context中的信息(如trace_id)自动注入日志。 - 可扩展的 Handler 接口 你可以自定义日志的输出格式、目标(文件、网络等)、过滤规则等,无需修改业务代码。
- 标准库,零依赖
一旦你的 Go 版本 >= 1.21,直接
import log/slog即可使用,不需要引入任何第三方库
对比传统 log 包
| 特性 | 标准库 log | log/slog |
|---|---|---|
| 日志级别 | 无,只有 Print/Fatal/Panic | 明确的 Debug/Info/Warn/Error |
| 结构化 | 不支持,只能拼接字符串 | 原生支持键值对字段 |
| 性能 | 一般 | 更高(尤其是结构化场景) |
| 扩展性 | 只能通过 SetOutput 改变输出 | 可通过实现 Handler 接口任意定制 |
典型使用场景
- 后台服务 / API 开发:需要结构化日志便于 ELK、Loki 等日志系统收集。
- 桌面应用:需要本地文件轮转、级别控制。
- CLI 工具:简单的带级别日志输出。