Golang简易日志实现进阶咨询:含slog、分级等需求的方案建议
基于Go 1.21+ slog的分级日志实现方案
核心设计思路
针对你的需求,直接用Go 1.21引入的slog标准库实现是当前最简洁高效的方案——它原生支持日志分级、结构化输出,还能轻松拆分为独立包。我们会明确区分通用消息日志和错误日志,同时封装成单独的logger包。
独立日志包实现示例
1. 包结构
your-project/ └── logger/ ├── logger.go └── go.mod
2. logger.go 代码实现
package logger import ( "log/slog" "os" ) // 全局日志实例,区分通用日志与错误日志 var ( // 通用消息日志:输出到stdout,包含info/warn级别 General *slog.Logger // 错误日志:输出到stderr,仅包含error级别 Error *slog.Logger ) func init() { // 通用日志配置 generalHandler := slog.NewTextHandler(os.Stdout, &slog.HandlerOptions{ Level: slog.LevelInfo, }) General = slog.New(generalHandler) // 错误日志配置 errorHandler := slog.NewTextHandler(os.Stderr, &slog.HandlerOptions{ Level: slog.LevelError, }) Error = slog.New(errorHandler) } // 封装快捷调用方法 func Info(msg string, args ...any) { General.Info(msg, args...) } func Warn(msg string, args ...any) { General.Warn(msg, args...) } func Error(msg string, args ...any) { Error.Error(msg, args...) } // 支持结构化字段扩展 func With(args ...any) *slog.Logger { return General.With(args...) }
项目中调用示例
package main import "your-project/logger" func main() { // 通用info级日志 logger.Info("服务启动完成", "port", 8080, "env", "production") // 警告级日志 logger.Warn("可选配置缺失", "key", "LOG_ROTATE_SIZE") // 错误级日志(输出到stderr) logger.Error("数据库连接失败", "err", "connection refused") // 带结构化字段的日志 userLogger := logger.With("user_id", 1001) userLogger.Info("用户登录成功") }
额外优化建议
- 自定义级别扩展:如果需要Debug级日志,只需将
HandlerOptions.Level改为slog.LevelDebug,并添加Debug快捷方法即可。 - 日志持久化与轮转:若需将日志写入文件并自动轮转,可配合
lumberjack这类库,替换slog.NewTextHandler的输出目标为轮转文件实例即可。 - JSON格式输出:把
slog.NewTextHandler替换为slog.NewJSONHandler,就能输出JSON格式日志,方便日志分析系统解析。 - 环境动态适配:通过读取环境变量(如
LOG_LEVEL),在init函数中动态设置日志级别,实现开发环境输出Debug、生产环境仅输出Info及以上的适配。
内容的提问来源于stack exchange,提问作者oleh babinskiy
相关产品推荐
相关产品推荐

