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