This commit is contained in:
2025-01-10 14:07:07 +08:00
commit 312e30c87b
15 changed files with 1356 additions and 0 deletions

124
pkg/logger/logger.go Normal file
View File

@@ -0,0 +1,124 @@
// Package logger 提供日志记录功能
package logger
import (
"fmt"
"os"
"path/filepath"
"strings"
"go.uber.org/zap"
"go.uber.org/zap/zapcore"
"gopkg.in/natefinch/lumberjack.v2"
"s5/pkg/config"
)
// 全局日志记录器实例
var logger *zap.SugaredLogger
// Init 初始化日志系统
// 根据配置创建日志记录器,支持同时输出到控制台和文件
func Init(cfg config.LogConfig) error {
// 设置日志级别
level, err := zapcore.ParseLevel(cfg.Level)
if err != nil {
level = zapcore.InfoLevel // 默认使用 INFO 级别
}
// 创建编码器配置
encoderConfig := zapcore.EncoderConfig{
TimeKey: "time", // 时间字段名
LevelKey: "level", // 级别字段名
NameKey: "logger", // 日志记录器名字段名
CallerKey: "caller", // 调用者字段名
MessageKey: "msg", // 消息字段名
StacktraceKey: "stacktrace", // 堆栈字段名
LineEnding: zapcore.DefaultLineEnding,
EncodeLevel: zapcore.CapitalLevelEncoder, // 大写编码器
EncodeTime: zapcore.ISO8601TimeEncoder, // ISO8601 时间格式
EncodeDuration: zapcore.SecondsDurationEncoder,
EncodeCaller: zapcore.ShortCallerEncoder,
}
// 创建输出核心列表
var cores []zapcore.Core
for _, output := range cfg.Output {
var ws zapcore.WriteSyncer
switch strings.ToLower(output) {
case "console":
// 控制台输出
ws = zapcore.AddSync(os.Stdout)
case "file":
// 文件输出
if err := os.MkdirAll(filepath.Dir(cfg.File), 0755); err != nil {
return fmt.Errorf("创建日志目录失败: %v", err)
}
// 配置日志轮转
ws = zapcore.AddSync(&lumberjack.Logger{
Filename: cfg.File, // 日志文件路径
MaxSize: cfg.MaxSize, // 单个文件最大大小(MB)
MaxBackups: cfg.MaxBackups,// 保留的旧文件数量
MaxAge: cfg.MaxAge, // 保留的最大天数
Compress: cfg.Compress, // 是否压缩旧文件
})
default:
continue // 跳过未知的输出类型
}
// 创建编码器
var encoder zapcore.Encoder
if cfg.Format == "json" {
encoder = zapcore.NewJSONEncoder(encoderConfig)
} else {
encoder = zapcore.NewConsoleEncoder(encoderConfig)
}
// 添加到核心列表
cores = append(cores, zapcore.NewCore(encoder, ws, level))
}
// 创建多核心日志记录器
core := zapcore.NewTee(cores...)
// 配置日志记录器选项
var opts []zap.Option
if cfg.ShowCaller {
opts = append(opts, zap.AddCaller())
}
// 创建日志记录器
zapLogger := zap.New(core, opts...)
logger = zapLogger.Sugar()
return nil
}
// Get 获取日志记录器实例
// 如果日志系统未初始化,会使用默认配置初始化
func Get() *zap.SugaredLogger {
if logger == nil {
// 使用默认配置初始化
Init(config.LogConfig{
Level: "info",
Output: []string{"console"},
ShowCaller: true,
Format: "text",
MaxSize: 2, // 2MB
MaxBackups: 5, // 保留5个旧文件
MaxAge: 7, // 保留7天
Compress: true, // 压缩旧文件
})
}
return logger
}
// Sync 同步日志缓冲
// 在程序退出前调用,确保所有日志都被写入
func Sync() error {
if logger != nil {
return logger.Sync()
}
return nil
}