Files
2026-06-30 15:14:37 +08:00

98 lines
2.1 KiB
Go

package logging
import (
"os"
"go.uber.org/zap"
"go.uber.org/zap/zapcore"
"gopkg.in/natefinch/lumberjack.v2"
)
// Logger 全局日志实例
var Logger *zap.Logger
// Config 日志配置
type Config struct {
Level string `json:"level"`
Format string `json:"format"`
Output string `json:"output"`
MaxSize int `json:"max_size"`
MaxBackups int `json:"max_backups"`
MaxAge int `json:"max_age"`
}
// Init 初始化日志系统
func Init(cfg Config) error {
// 解析日志级别
level := zap.NewAtomicLevel()
switch cfg.Level {
case "debug":
level.SetLevel(zap.DebugLevel)
case "info":
level.SetLevel(zap.InfoLevel)
case "warn":
level.SetLevel(zap.WarnLevel)
case "error":
level.SetLevel(zap.ErrorLevel)
default:
level.SetLevel(zap.InfoLevel)
}
// 配置编码器
var encoder zapcore.Encoder
encoderConfig := zap.NewProductionEncoderConfig()
encoderConfig.TimeKey = "time"
encoderConfig.EncodeTime = zapcore.ISO8601TimeEncoder
encoderConfig.CallerKey = "caller"
encoderConfig.MessageKey = "message"
encoderConfig.LevelKey = "level"
if cfg.Format == "console" {
encoder = zapcore.NewConsoleEncoder(encoderConfig)
} else {
encoder = zapcore.NewJSONEncoder(encoderConfig)
}
// 配置输出
var writeSyncer zapcore.WriteSyncer
if cfg.Output != "" {
// 使用文件轮转
lumberJackLogger := &lumberjack.Logger{
Filename: cfg.Output,
MaxSize: cfg.MaxSize,
MaxBackups: cfg.MaxBackups,
MaxAge: cfg.MaxAge,
Compress: true,
LocalTime: true,
}
writeSyncer = zapcore.AddSync(lumberJackLogger)
} else {
writeSyncer = zapcore.AddSync(os.Stdout)
}
// 创建核心
core := zapcore.NewCore(encoder, writeSyncer, level)
// 创建 logger
Logger = zap.New(core, zap.AddCaller(), zap.AddStacktrace(zap.ErrorLevel))
return nil
}
// GetLogger 获取日志实例
func GetLogger() *zap.Logger {
if Logger == nil {
// 如果未初始化,返回一个默认的 stdout logger
Logger, _ = zap.NewDevelopment()
}
return Logger
}
// Sync 刷新日志缓冲
func Sync() error {
if Logger != nil {
return Logger.Sync()
}
return nil
}