goweb3系列解析8: golog 模块解析
golog 模块解析golog是 goweb3 项目的日志封装模块基于logrus构建提供统一的日志接口支持多级别日志输出、格式化输出等功能。一、模块架构plainTextgolog/ ├── go_log.go # 日志封装类单例 ├── go_log_init.go # 依赖注入注册 ├── go_logger.go # 日志工具函数 └── dbfile_logger.go # 数据库/文件日志扩展二、核心组件详解1. GoLog - 日志封装类gotype GoLog struct { basedto.BaseEntitySingle // 单例模式基类 } // 支持的日志方法 func (self GoLog) Info(v ...interface{}) // 信息级别 func (self GoLog) Debug(v ...interface{}) // 调试级别 func (self GoLog) Error(v ...interface{}) // 错误级别 func (self GoLog) Infof(v ...interface{}) // 格式化信息 func (self GoLog) Debuf(v ...interface{}) // 格式化调试笔误 func (self GoLog) Errorf(v ...interface{}) // 格式化错误设计特点继承BaseEntitySingle实现单例模式方法调用委托给底层工具函数2. 日志工具函数go_logger.gogofunc Info(v ...any) // 信息日志 func Debug(v ...interface{}) // 调试日志同时输出到 goutils 和 logrus func Println(v ...interface{}) // 打印日志 func Warn(v ...interface{}) // 警告日志 func Error(v ...interface{}) // 错误日志同时输出到 goutils.Info 和 goutils.Error func Stat(v ...interface{}) // 统计日志 func StatInfo(v ...interface{}) // 统计信息日志 // 特定模块日志 func InfoDb(v ...interface{}) // 数据库日志 func ErrorDb(v ...interface{}) // 数据库错误日志 func InfoEs(v ...interface{}) // ES 日志 func ErrorEs(v ...interface{}) // ES 错误日志3. logrus 初始化gofunc InitLogrus() { // 设置日志级别 logrus.SetLevel(logrus.DebugLevel) // 启用调用者信息 logrus.SetReportCaller(true) // 设置格式化器 logrus.SetFormatter(logrus.TextFormatter{ ForceColors: true, // 强制颜色输出 EnvironmentOverrideColors: true, // 环境变量覆盖颜色 TimestampFormat: 2006-01-12 15:04:05, FullTimestamp: true, // 显示完整时间戳 DisableLevelTruncation: true, // 不截断级别名称 }) }4. 数据格式化工具go// 将非字符串参数转为 JSON func Ini2JsonStr(v ...any) { for i : 0; i len(v); i { if v nil { continue } if _, ok : v[i].(string); !ok { baseutils.IfProxy(v[i]) v[i] jsonutils.ToJsonPretty(v[i]) // 转为格式化 JSON } } } // 标准文本处理 func StdTextProc(v ...any) string { // 处理转义字符 // 返回格式化后的字符串 }三、依赖注入govar singleNameGoLog *golog.GoLog-97631d51-8292-465a-b05f-ae17d4d6a46c func init() { registerBeanGoLog() } func registerBeanGoLog() { err : basedi.RegisterLoadBean(singleNameGoLog, LoadGoLog) } func FindBeanGoLog() *GoLog { if bean, ok : basedi.FindBeanOk(singleNameGoLog); ok { return bean.(*GoLog) } return nil }四、日志级别与输出目标级别方法输出目标InfoInfo()goutils.InfoDebugDebug()goutils.Debuglogrus.InfoWarnWarn()goutils.Warnlogrus.InfoErrorError()goutils.Infogoutils.ErrorStatStat()goutils.StatStatInfoStatInfo()goutils.Statlogrus.Info五、使用示例1. 直接调用工具函数gogolog.Info(服务启动成功) golog.Debug(调试信息:, someObject) golog.Error(发生错误:, err) golog.Stat(性能统计:, stats)2. 通过单例调用golog : golog.FindBeanGoLog() log.Info(信息日志) log.Error(错误日志)3. 特定模块日志gogolog.InfoDb(数据库查询完成) golog.InfoEs(ES 查询结果:, result)六、设计亮点特性实现方式优势统一接口封装 logrus 和 goutils统一日志入口便于切换底层实现单例模式依赖注入容器管理全局共享避免重复初始化多目标输出同时输出到多个目标灵活的日志收集策略JSON 格式化Ini2JsonStr自动转换结构化日志输出彩色输出logrus TextFormatter控制台可读性好调用者信息SetReportCaller(true)方便定位日志来源七、依赖关系plainTextgolog ├── basedto.BaseEntitySingle # 单例基类 ├── basedi # 依赖注入 ├── goutils # 底层日志工具 ├── logrus # 核心日志库 └── jsonutils # JSON 格式化八、日志输出格式plainText时间戳 [级别] 调用者: 消息 例如: 2024-01-12 15:04:05 INFO goconfig/ichublog/golog/go_logger.go:42 - 服务启动成功九、扩展能力模块还包含dbfile_logger.go支持将日志写入数据库或文件通过dbfile_logger_init.go注册为 bean可根据需求选择不同的日志持久化策略。