Files
tyapi-server/internal/shared/logger/factory.go
2025-08-25 15:44:06 +08:00

148 lines
3.7 KiB
Go

package logger
import (
"go.uber.org/zap"
"go.uber.org/zap/zapcore"
)
// LoggerFactory 日志器工厂 - 基于 Zap 官方推荐
type LoggerFactory struct {
config Config
}
// NewLoggerFactory 创建日志器工厂
func NewLoggerFactory(config Config) *LoggerFactory {
return &LoggerFactory{
config: config,
}
}
// CreateLogger 创建普通日志器
func (f *LoggerFactory) CreateLogger() (Logger, error) {
return NewLogger(f.config)
}
// CreateProductionLogger 创建生产环境日志器 - 使用 Zap 官方推荐
func (f *LoggerFactory) CreateProductionLogger() (*zap.Logger, error) {
// 使用 Zap 官方的生产环境预设
logger, err := zap.NewProduction(
zap.AddCaller(),
zap.AddCallerSkip(1),
zap.AddStacktrace(zapcore.ErrorLevel),
)
if err != nil {
return nil, err
}
// 如果配置为文件输出,需要手动设置 Core
if f.config.Output == "file" {
writeSyncer, err := createFileWriteSyncer(f.config)
if err != nil {
return nil, err
}
// 创建新的 Core 并替换
encoder := getEncoder(f.config.Format, f.config)
level := getLogLevel(f.config.Level)
core := zapcore.NewCore(encoder, writeSyncer, level)
logger = zap.New(core, zap.AddCaller(), zap.AddCallerSkip(1), zap.AddStacktrace(zapcore.ErrorLevel))
}
return logger, nil
}
// CreateDevelopmentLogger 创建开发环境日志器 - 使用 Zap 官方推荐
func (f *LoggerFactory) CreateDevelopmentLogger() (*zap.Logger, error) {
// 使用 Zap 官方的开发环境预设
logger, err := zap.NewDevelopment(
zap.AddCaller(),
zap.AddCallerSkip(1),
zap.AddStacktrace(zapcore.ErrorLevel),
)
if err != nil {
return nil, err
}
// 如果配置为文件输出,需要手动设置 Core
if f.config.Output == "file" {
writeSyncer, err := createFileWriteSyncer(f.config)
if err != nil {
return nil, err
}
// 创建新的 Core 并替换
encoder := getEncoder(f.config.Format, f.config)
level := getLogLevel(f.config.Level)
core := zapcore.NewCore(encoder, writeSyncer, level)
logger = zap.New(core, zap.AddCaller(), zap.AddCallerSkip(1), zap.AddStacktrace(zapcore.ErrorLevel))
}
return logger, nil
}
// CreateCustomLogger 创建自定义配置日志器
func (f *LoggerFactory) CreateCustomLogger() (*zap.Logger, error) {
// 根据环境选择预设
if f.config.Development {
return f.CreateDevelopmentLogger()
}
return f.CreateProductionLogger()
}
// CreateLoggerByEnvironment 根据环境创建合适的日志器
func (f *LoggerFactory) CreateLoggerByEnvironment() (*zap.Logger, error) {
if f.config.Development {
return f.CreateDevelopmentLogger()
}
return f.CreateProductionLogger()
}
// CreateLoggerWithOptions 使用选项模式创建日志器
func (f *LoggerFactory) CreateLoggerWithOptions(options ...LoggerOption) (*zap.Logger, error) {
// 应用选项
for _, option := range options {
option(&f.config)
}
// 创建日志器
return f.CreateLoggerByEnvironment()
}
// LoggerOption 日志器选项函数
type LoggerOption func(*Config)
// WithLevel 设置日志级别
func WithLevel(level string) LoggerOption {
return func(config *Config) {
config.Level = level
}
}
// WithFormat 设置日志格式
func WithFormat(format string) LoggerOption {
return func(config *Config) {
config.Format = format
}
}
// WithOutput 设置输出目标
func WithOutput(output string) LoggerOption {
return func(config *Config) {
config.Output = output
}
}
// WithDevelopment 设置是否为开发环境
func WithDevelopment(development bool) LoggerOption {
return func(config *Config) {
config.Development = development
}
}
// WithColor 设置是否使用彩色输出
func WithColor(useColor bool) LoggerOption {
return func(config *Config) {
config.UseColor = useColor
}
}