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 | ||
|  | 	} | ||
|  | } |