|
|
@@ -0,0 +1,110 @@
|
|
|
+package logx
|
|
|
+
|
|
|
+import (
|
|
|
+ "io"
|
|
|
+
|
|
|
+ "github.com/rs/zerolog"
|
|
|
+ "github.com/rs/zerolog/pkgerrors"
|
|
|
+)
|
|
|
+
|
|
|
+// Init 日志库的核心初始化函数,提供最大的灵活性和控制能力
|
|
|
+//
|
|
|
+// 该函数是日志库最基础的初始化方法,允许完全自定义日志写入器的创建方式
|
|
|
+// 适用于需要精细控制日志配置、单元测试、特殊需求等高级场景
|
|
|
+//
|
|
|
+// 参数:
|
|
|
+//
|
|
|
+// locationName - 时区名称,用于日志时间戳格式化(如 "Asia/Shanghai")
|
|
|
+// getWriter - 写入器获取函数,接收标签参数返回对应的 io.Writer
|
|
|
+// tags - 要初始化的日志类型标签(可变参数)
|
|
|
+//
|
|
|
+// 支持的标签类型:
|
|
|
+// - "info" : 信息级别日志
|
|
|
+// - "error" : 错误级别日志(自动包含堆栈信息)
|
|
|
+// - "debug" : 调试级别日志
|
|
|
+// - "gin" : Gin 框架专用日志
|
|
|
+// - "gorm" : GORM 数据库专用日志
|
|
|
+// - "nano" : Nano 游戏服务器框架专用日志
|
|
|
+//
|
|
|
+// 使用示例:
|
|
|
+//
|
|
|
+// // 基础使用:为不同标签创建不同的文件写入器
|
|
|
+// logx.Init("Asia/Shanghai", func(tag string) io.Writer {
|
|
|
+// return logx.DefaultWriter("logs/app."+tag+".log", true)
|
|
|
+// }, "info", "error", "debug")
|
|
|
+//
|
|
|
+// // 高级配置:为不同标签使用不同的配置
|
|
|
+// logx.Init("UTC", func(tag string) io.Writer {
|
|
|
+// switch tag {
|
|
|
+// case "error":
|
|
|
+// // 错误日志使用更大的文件和更长的保留时间
|
|
|
+// return logx.NewWriter("logs/error.log", logx.WriterConfig{
|
|
|
+// Rolling: logx.WriterRollingConfig{
|
|
|
+// MaxMegabytes: 100,
|
|
|
+// MaxDays: 90,
|
|
|
+// MaxBackups: 100,
|
|
|
+// Compress: true,
|
|
|
+// },
|
|
|
+// })
|
|
|
+// default:
|
|
|
+// // 其他日志使用标准配置
|
|
|
+// return logx.DefaultWriter("logs/"+tag+".log", true)
|
|
|
+// }
|
|
|
+// }, "info", "error", "debug")
|
|
|
+//
|
|
|
+// // 单元测试:使用内存缓冲区
|
|
|
+// var infoBuffer, errorBuffer bytes.Buffer
|
|
|
+// logx.Init("UTC", func(tag string) io.Writer {
|
|
|
+// switch tag {
|
|
|
+// case "info":
|
|
|
+// return &infoBuffer
|
|
|
+// case "error":
|
|
|
+// return &errorBuffer
|
|
|
+// default:
|
|
|
+// return io.Discard
|
|
|
+// }
|
|
|
+// }, "info", "error")
|
|
|
+//
|
|
|
+// 设计优势:
|
|
|
+// - 完全控制: 可以为每个日志标签单独配置写入器
|
|
|
+// - 灵活性强: 支持任意复杂的写入器创建逻辑
|
|
|
+// - 易于测试: 便于单元测试中模拟不同的写入器行为
|
|
|
+// - 架构清晰: 分离了初始化逻辑和写入器创建逻辑
|
|
|
+//
|
|
|
+// 注意事项:
|
|
|
+// - 这是最底层的初始化函数,需要手动处理所有配置细节
|
|
|
+// - 对于简单场景,建议使用 InitDefault 或 InitDefaultWithWriter
|
|
|
+// - 确保为每个需要的标签提供有效的写入器
|
|
|
+func Init(locationName string, getWriter func(tag string) io.Writer, tags ...string) {
|
|
|
+ // 配置 zerolog 的错误堆栈序列化器
|
|
|
+ // 启用错误堆栈信息记录,便于调试和问题追踪
|
|
|
+ zerolog.ErrorStackMarshaler = pkgerrors.MarshalStack
|
|
|
+
|
|
|
+ // 设置全局时区配置
|
|
|
+ // 影响所有日志记录的时间戳格式化
|
|
|
+ loggingLocationName = locationName
|
|
|
+
|
|
|
+ // 遍历所有传入的标签,为每个标签初始化对应的日志写入器
|
|
|
+ for _, tag := range tags {
|
|
|
+ switch tag {
|
|
|
+ case "info":
|
|
|
+ // 初始化信息级别日志写入器
|
|
|
+ InitInfoWriter(getWriter(tag))
|
|
|
+ case "error":
|
|
|
+ // 初始化错误级别日志写入器(自动包含堆栈信息)
|
|
|
+ InitErrorWriter(getWriter(tag))
|
|
|
+ case "debug":
|
|
|
+ // 初始化调试级别日志写入器
|
|
|
+ InitDebugWriter(getWriter(tag))
|
|
|
+ case "gin":
|
|
|
+ // 初始化 Gin 框架专用日志写入器
|
|
|
+ InitGinWriter(getWriter(tag))
|
|
|
+ case "gorm":
|
|
|
+ // 初始化 GORM 数据库专用日志写入器
|
|
|
+ InitGormWriter(getWriter(tag))
|
|
|
+ case "nano":
|
|
|
+ // 初始化 Nano 游戏服务器框架专用日志写入器
|
|
|
+ InitNanoWriter(getWriter(tag))
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|