148 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			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
 | |
| 	}
 | |
| }
 |