Files
VptPassiveAdapter/logger/logger.go
T
2026-07-02 20:19:33 +08:00

89 lines
2.2 KiB
Go

package logger
import (
"go.uber.org/zap"
"go.uber.org/zap/zapcore"
"gopkg.in/natefinch/lumberjack.v2"
)
var Logger *zap.Logger
// atomicLevel 持有当前生效的日志级别,支持在配置加载完成后动态调整(无需重建 Logger)
var atomicLevel = zap.NewAtomicLevelAt(zap.InfoLevel)
func Init() error {
config := zap.NewProductionConfig()
config.OutputPaths = []string{"stdout"}
config.ErrorOutputPaths = []string{"stderr"}
// 配置日志轮换
lumberJackLogger := &lumberjack.Logger{
Filename: "logs/app.log",
MaxSize: 10, // MB
MaxBackups: 3,
MaxAge: 30, // days
Compress: true,
}
// 创建写入器
w := zapcore.AddSync(lumberJackLogger)
// 创建编码器配置
encoderConfig := zap.NewProductionEncoderConfig()
encoderConfig.TimeKey = "time"
encoderConfig.EncodeTime = zapcore.TimeEncoderOfLayout("2006-01-02 15:04:05")
encoderConfig.EncodeCaller = zapcore.ShortCallerEncoder
encoderConfig.EncodeLevel = zapcore.CapitalLevelEncoder
encoderConfig.MessageKey = "msg"
encoderConfig.CallerKey = "caller"
// 创建控制台编码器(文本格式)
encoder := zapcore.NewConsoleEncoder(encoderConfig)
// 创建核心
core := zapcore.NewCore(encoder, w, atomicLevel)
// 创建日志记录器
Logger = zap.New(core, zap.AddCaller(), zap.AddStacktrace(zapcore.ErrorLevel))
return nil
}
// SetLevel 动态调整日志级别,可在配置文件加载完成后调用(例如开启 debug 日志排查问题)。
// levelStr 支持 debug/info/warn/error 等,为空或非法值时保持当前级别不变并返回错误。
func SetLevel(levelStr string) error {
if levelStr == "" {
return nil
}
var level zapcore.Level
if err := level.UnmarshalText([]byte(levelStr)); err != nil {
return err
}
atomicLevel.SetLevel(level)
return nil
}
func Info(message string, fields ...zap.Field) {
Logger.Info(message, fields...)
}
func Error(message string, fields ...zap.Field) {
Logger.Error(message, fields...)
}
func Warn(message string, fields ...zap.Field) {
Logger.Warn(message, fields...)
}
func Debug(message string, fields ...zap.Field) {
Logger.Debug(message, fields...)
}
func Fatal(message string, fields ...zap.Field) {
Logger.Fatal(message, fields...)
}
func Sync() error {
return Logger.Sync()
}