# Logger 日志工具包 ## 概述 统一的日志工具包,基于 [zap](https://github.com/uber-go/zap) 日志框架。所有微服务共享此包,但每个服务独立初始化自己的logger实例。 ## 特性 - ✅ 每个服务独立的logger实例 - ✅ 统一的日志格式和配置方式 - ✅ 支持开发和生产环境不同配置 - ✅ 自动添加服务名标识 - ✅ 结构化日志(JSON格式,生产环境) - ✅ 彩色控制台输出(开发环境) - ✅ 支持日志文件输出(生产环境) ## 安装依赖 ```bash cd /Users/haihuizhu/infinite_matrix/top-fans/backend go get go.uber.org/zap go mod tidy ``` ## 使用方法 ### 1. 在服务中初始化 ```go package main import ( "os" "github.com/topfans/backend/pkg/logger" ) func main() { // 初始化日志(必须在最前面) env := os.Getenv("ENV") if env == "" { env = "development" } if err := logger.Init(logger.Config{ ServiceName: "user-service", // 服务名称 Environment: env, // development 或 production LogLevel: os.Getenv("LOG_LEVEL"), // debug, info, warn, error LogPath: "", // 可选,默认为 "logs" }); err != nil { panic(fmt.Sprintf("Failed to initialize logger: %v", err)) } defer logger.Sync() // 程序退出前刷新日志缓冲区 logger.Sugar.Info("Service started") } ``` ### 2. 使用Sugar API(简单易用) ```go import "github.com/topfans/backend/pkg/logger" // Info级别 logger.Sugar.Infof("User registered: mobile=%s, user_id=%d", mobile, userID) // Error级别 logger.Sugar.Errorf("Failed to create user: %v", err) // Debug级别 logger.Sugar.Debugf("Processing request: mobile=%s", mobile) // Warn级别 logger.Sugar.Warnf("Token expired: user_id=%d", userID) ``` ### 3. 使用结构化日志(推荐,性能更好) ```go import ( "github.com/topfans/backend/pkg/logger" "go.uber.org/zap" ) // Info级别 logger.Logger.Info("User registered", zap.String("mobile", mobile), zap.Int64("user_id", userID), zap.Int64("star_id", starID), ) // Error级别 logger.Logger.Error("Failed to create user", zap.String("mobile", mobile), zap.Error(err), ) // Debug级别 logger.Logger.Debug("Processing request", zap.String("mobile", mobile), ) ``` ## 环境变量配置 ### 开发环境 ```bash export ENV=development export LOG_LEVEL=debug ``` ### 生产环境 ```bash export ENV=production export LOG_LEVEL=info export LOG_PATH=/var/log/user-service # 可选 ``` ## 日志格式 ### 开发环境(控制台) ``` 2024-01-01T10:00:00.000+0800 INFO service=user-service User registered {"mobile": "13800138000", "user_id": 123} ``` ### 生产环境(JSON格式) ```json { "level": "info", "ts": 1704067200.000, "caller": "auth_service.go:45", "msg": "User registered", "service": "user-service", "mobile": "13800138000", "user_id": 123 } ``` ## 日志文件 生产环境下,日志会同时输出到: - `stdout` - 标准输出 - `logs/{service-name}.log` - 正常日志文件 - `logs/{service-name}-error.log` - 错误日志文件 日志目录会在初始化时自动创建。 ## 最佳实践 1. **在main函数最开始初始化logger** 2. **使用结构化日志**(`Logger.Info`)而不是Sugar API(生产环境) 3. **不要记录敏感信息**(密码、完整Token等) 4. **记录关键操作**(注册、登录、Token刷新等) 5. **错误必须记录**,包含上下文信息 ## API 文档 ### Config 日志配置结构: ```go type Config struct { ServiceName string // 服务名称(必需) Environment string // 环境:development 或 production LogLevel string // 日志级别:debug, info, warn, error LogPath string // 日志文件路径(可选) } ``` ### Init 初始化logger: ```go func Init(config Config) error ``` ### Sync 刷新日志缓冲区(程序退出前调用): ```go func Sync() ``` ### GetLogger / GetSugar 获取logger实例(用于依赖注入): ```go func GetLogger() *zap.Logger func GetSugar() *zap.SugaredLogger ``` ## 示例 完整示例请参考:`services/userService/main.go`