Files
xlgo-core/logger/logger.go
T
杭州明婳科技 2dfcbbbb22 init
2026-04-30 23:26:14 +08:00

174 lines
3.6 KiB
Go

package logger
import (
"os"
"path/filepath"
"github.com/EthanCodeCraft/xlgo-core/config"
"go.uber.org/zap"
"go.uber.org/zap/zapcore"
"gopkg.in/natefinch/lumberjack.v2"
)
var (
// Logger 全局日志实例
Logger *zap.Logger
sugar *zap.SugaredLogger
apiLog *zap.Logger
dbLog *zap.Logger
)
// Init 初始化日志
func Init(cfg *config.Config) error {
// 确保日志目录存在
if err := os.MkdirAll(cfg.Log.Dir, 0755); err != nil {
return err
}
// 日志编码器配置
encoderConfig := zapcore.EncoderConfig{
TimeKey: "time",
LevelKey: "level",
NameKey: "logger",
CallerKey: "caller",
FunctionKey: zapcore.OmitKey,
MessageKey: "msg",
StacktraceKey: "stacktrace",
LineEnding: zapcore.DefaultLineEnding,
EncodeLevel: zapcore.LowercaseLevelEncoder,
EncodeTime: zapcore.ISO8601TimeEncoder,
EncodeDuration: zapcore.SecondsDurationEncoder,
EncodeCaller: zapcore.ShortCallerEncoder,
}
// 根据运行模式设置日志级别
var level zapcore.Level
if cfg.IsProduction() {
level = zapcore.WarnLevel
} else {
level = zapcore.DebugLevel
}
// API 日志
apiWriter := &lumberjack.Logger{
Filename: filepath.Join(cfg.Log.Dir, "api.log"),
MaxSize: cfg.Log.MaxSize,
MaxBackups: cfg.Log.MaxBackups,
MaxAge: cfg.Log.MaxAge,
Compress: cfg.Log.Compress,
}
// 数据库日志
dbWriter := &lumberjack.Logger{
Filename: filepath.Join(cfg.Log.Dir, "database.log"),
MaxSize: cfg.Log.MaxSize,
MaxBackups: cfg.Log.MaxBackups,
MaxAge: cfg.Log.MaxAge,
Compress: cfg.Log.Compress,
}
// 控制台输出
consoleEncoder := zapcore.NewConsoleEncoder(encoderConfig)
consoleWriter := zapcore.AddSync(os.Stdout)
// 创建核心
apiCore := zapcore.NewCore(
zapcore.NewJSONEncoder(encoderConfig),
zapcore.AddSync(apiWriter),
level,
)
dbCore := zapcore.NewCore(
zapcore.NewJSONEncoder(encoderConfig),
zapcore.AddSync(dbWriter),
level,
)
consoleCore := zapcore.NewCore(
consoleEncoder,
consoleWriter,
level,
)
// 合并核心
core := zapcore.NewTee(apiCore, dbCore, consoleCore)
// 创建日志实例
Logger = zap.New(core, zap.AddCaller(), zap.AddCallerSkip(1))
sugar = Logger.Sugar()
// 创建专用日志实例
apiLog = zap.New(apiCore, zap.AddCaller(), zap.AddCallerSkip(1))
dbLog = zap.New(dbCore, zap.AddCaller(), zap.AddCallerSkip(1))
return nil
}
// Sync 同步日志
func Sync() {
if Logger != nil {
_ = Logger.Sync()
}
}
// Debug 调试日志
func Debug(msg string, fields ...zap.Field) {
Logger.Debug(msg, fields...)
}
// Info 信息日志
func Info(msg string, fields ...zap.Field) {
Logger.Info(msg, fields...)
}
// Warn 警告日志
func Warn(msg string, fields ...zap.Field) {
Logger.Warn(msg, fields...)
}
// Error 错误日志
func Error(msg string, fields ...zap.Field) {
Logger.Error(msg, fields...)
}
// Fatal 致命错误日志
func Fatal(msg string, fields ...zap.Field) {
Logger.Fatal(msg, fields...)
}
// Debugf 格式化调试日志
func Debugf(template string, args ...any) {
sugar.Debugf(template, args...)
}
// Infof 格式化信息日志
func Infof(template string, args ...any) {
sugar.Infof(template, args...)
}
// Warnf 格式化警告日志
func Warnf(template string, args ...any) {
sugar.Warnf(template, args...)
}
// Errorf 格式化错误日志
func Errorf(template string, args ...any) {
sugar.Errorf(template, args...)
}
// Fatalf 格式化致命错误日志
func Fatalf(template string, args ...any) {
sugar.Fatalf(template, args...)
}
// APILog API 专用日志
func APILog() *zap.Logger {
return apiLog
}
// DBLog 数据库专用日志
func DBLog() *zap.Logger {
return dbLog
}