init
This commit is contained in:
124
pkg/logger/logger.go
Normal file
124
pkg/logger/logger.go
Normal 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
|
||||
}
|
||||
Reference in New Issue
Block a user