topfans/backend/pkg/logger/logger.go
2026-04-07 22:29:48 +08:00

109 lines
2.3 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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
}