feat(log): B-03 日志轮转配置 - 添加 lumberjack 支持

- 添加 lumberjack.v2 依赖实现日志轮转
- 支持配置文件输出(stdout/stderr/file)
- 支持文件轮转(100MB/3备份/7天/压缩)
- 添加 Config 结构体灵活配置
- 添加完整测试用例

测试验证:
- TestInitWithConfig PASS
- TestInitWithConfigFileOutput PASS
- TestDefaultConfig PASS
- 全量日志测试通过
This commit is contained in:
phamnazage-jpg
2026-06-01 22:06:56 +08:00
parent 714c4acbe4
commit cf7dd35e1d
4 changed files with 120 additions and 2 deletions

View File

@@ -9,10 +9,35 @@ import (
"time"
"log/slog"
"gopkg.in/natefinch/lumberjack.v2"
)
var logger *slog.Logger
// Config holds logging configuration
type Config struct {
Level string
Output string // "stdout", "stderr", or file path
Rotation bool // enable file rotation
MaxSize int // MB
MaxBackups int
MaxAge int // days
Compress bool
}
// DefaultConfig returns default logging configuration
func DefaultConfig() Config {
return Config{
Level: "INFO",
Output: "stdout",
Rotation: false,
MaxSize: 100,
MaxBackups: 3,
MaxAge: 7,
Compress: true,
}
}
// sensitiveFields contains field names that should be sanitized in logs
var sensitiveFields = []string{
"token",
@@ -35,14 +60,47 @@ func Init() {
// InitWithLevel initializes the logger with specified level
func InitWithLevel(level string) {
levelVar := parseLevel(level)
cfg := DefaultConfig()
cfg.Level = level
InitWithConfig(cfg)
}
// InitWithConfig initializes the logger with full configuration
func InitWithConfig(cfg Config) {
levelVar := parseLevel(cfg.Level)
opts := &slog.HandlerOptions{
Level: levelVar,
ReplaceAttr: sanitizeAttrs,
}
handler := slog.NewJSONHandler(os.Stdout, opts)
var handler slog.Handler
switch cfg.Output {
case "stdout":
handler = slog.NewJSONHandler(os.Stdout, opts)
case "stderr":
handler = slog.NewJSONHandler(os.Stderr, opts)
default:
// File output with optional rotation
if cfg.Rotation {
lumberjackLogger := &lumberjack.Logger{
Filename: cfg.Output,
MaxSize: cfg.MaxSize,
MaxBackups: cfg.MaxBackups,
MaxAge: cfg.MaxAge,
Compress: cfg.Compress,
}
handler = slog.NewJSONHandler(lumberjackLogger, opts)
} else {
file, err := os.OpenFile(cfg.Output, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644)
if err != nil {
panic(err)
}
handler = slog.NewJSONHandler(file, opts)
}
}
logger = slog.New(handler)
slog.SetDefault(logger)
}