package logger import ( "os" "go.uber.org/zap" "go.uber.org/zap/zapcore" ) var ( // Logger 全局logger实例(每个服务独立) Logger *zap.Logger // Sugar 全局Sugar实例 Sugar *zap.SugaredLogger ) // Config 日志配置 type Config struct { ServiceName string // 服务名称(如:user-service, asset-service) Environment string // 环境:development 或 production LogLevel string // 日志级别:debug, info, warn, error LogPath string // 日志文件路径(可选,默认为当前目录下的logs/) } // Init 初始化日志(每个服务独立调用) func Init(config Config) error { var zapConfig zap.Config // 设置服务名作为默认字段 serviceNameField := zap.String("service", config.ServiceName) // 环境判断 if config.Environment == "development" { // 开发环境:彩色控制台输出 zapConfig = zap.NewDevelopmentConfig() zapConfig.EncoderConfig.EncodeLevel = zapcore.CapitalColorLevelEncoder } else { // 生产环境:JSON格式,文件输出 zapConfig = zap.NewProductionConfig() // 设置日志文件路径 logPath := config.LogPath if logPath == "" { logPath = "logs" } // 创建日志目录 if err := os.MkdirAll(logPath, 0755); err != nil { return err } zapConfig.OutputPaths = []string{ "stdout", logPath + "/" + config.ServiceName + ".log", } zapConfig.ErrorOutputPaths = []string{ "stderr", logPath + "/" + config.ServiceName + "-error.log", } } // 设置日志级别 logLevel := config.LogLevel if logLevel == "" { logLevel = os.Getenv("LOG_LEVEL") if logLevel == "" { logLevel = "info" } } var level zapcore.Level if err := level.UnmarshalText([]byte(logLevel)); err == nil { zapConfig.Level = zap.NewAtomicLevelAt(level) } // 构建logger var err error Logger, err = zapConfig.Build( zap.AddCaller(), zap.AddStacktrace(zapcore.ErrorLevel), zap.Fields(serviceNameField), // 添加服务名字段 ) if err != nil { return err } // 创建Sugar实例 Sugar = Logger.Sugar() return nil } // Sync 刷新日志缓冲区(程序退出前调用) func Sync() { if Logger != nil { _ = Logger.Sync() } } // GetLogger 获取logger实例(用于依赖注入) func GetLogger() *zap.Logger { return Logger } // GetSugar 获取Sugar实例(用于依赖注入) func GetSugar() *zap.SugaredLogger { return Sugar }