125 lines
3.3 KiB
Go
125 lines
3.3 KiB
Go
// 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
|
|
}
|