109 lines
2.3 KiB
Go
109 lines
2.3 KiB
Go
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
|
||
}
|