提供日志组件,基于 Go 官方 slog 实现,提供日志级别、日志格式、日志路径、日志最大尺寸、日志最大天数、日志最大备份数量等配置。
封装了GORM,kafka相关日志实现,其他可以自行扩展。
New(config *LogConfig) 是日志入口,返回 *slog.Logger。
- 先通过
normalizeConfig补齐默认值:app_name为空时使用no_app_namemax_size默认1024max_age默认7format支持json和text,其他值默认按json处理
- 如果
log_path不为空,会创建目录:log_path/app_name
- 文件日志使用
github.com/DeRuina/timberjack做切割:- 文件名为
app_name_format.log - 按
max_size、max_age、max_backups控制切割和保留 - 归档压缩格式为
gzip
- 文件名为
- 如果
no_stdout=false,会同时输出到控制台。 - 文件和控制台通过
io.MultiWriter组合,所以可以同时写入。 - 根据
format创建 slog handler:json使用slog.NewJSONHandlertext使用slog.NewTextHandler
- 外层包一层
ContextHandler,用于从context.Context注入扩展字段。
初始化时会通过 logger.With 固定写入应用信息:
appNameversionenvid
slog 默认字段会经过 ReplaceAttr 转换:
time转为datetime,格式为2006-01-02 15:04:05.000source转为lineNumber,格式为file.go:line
最终 JSON 日志示例:
{"datetime":"2026-06-11 11:45:30.778","level":"INFO","lineNumber":"logger_test.go:29","msg":"hello","appName":"app","version":"v1","env":"test","id":"node-1","requestId":"rid","ext":{"request_id":"rid"}}level 配置映射到 slog 级别:
debug或未知值:slog.LevelDebuginfo:slog.LevelInfowarn/warning:slog.LevelWarnerror:slog.LevelErrorpanic:按error阈值处理
组件支持从 context.Context 读取扩展字段。
单独写入 request id:
ctx := vlogger.WithRequestID(context.Background(), "rid")
logger.InfoContext(ctx, "hello")写入扩展字段和 request id:
ctx := vlogger.WithExt(context.Background(), &vlogger.ExtLogValue{
RequestID: "rid",
Ext: map[string]string{
"request_id": "rid",
},
})
logger.InfoContext(ctx, "hello")如果同时使用 WithRequestID 和 WithExt.RequestID,WithRequestID 的值优先。
logger := vlogger.New(&vlogger.LogConfig{
AppName: "app",
AppVersion: "v1",
Env: "prod",
ID: "node-1",
LogPath: "./logs",
Level: "info",
Format: "json",
MaxSize: 1024,
MaxAge: 7,
MaxBackups: 10,
NoStdout: false,
})
logger.Info("service started")