| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135 |
- package logger
- import (
- "fmt"
- "go.uber.org/zap"
- "go.uber.org/zap/zapcore"
- )
- // loggerConfig 内部配置结构体
- type loggerConfig struct {
- level zapcore.Level
- development bool
- encoding string
- outputPaths []string
- }
- // LoggerOption 配置选项函数类型
- type LoggerOption func(*loggerConfig)
- // WithLevel 设置日志级别
- func WithLevel(level zapcore.Level) LoggerOption {
- return func(c *loggerConfig) {
- c.level = level
- }
- }
- // WithOutputPaths 设置输出路径
- func WithOutputPaths(paths ...string) LoggerOption {
- return func(c *loggerConfig) {
- c.outputPaths = paths
- }
- }
- // WithDevelopment 设置开发模式
- func WithDevelopment(dev bool) LoggerOption {
- return func(c *loggerConfig) {
- c.development = dev
- }
- }
- // WithEncoding 设置编码格式
- func WithEncoding(encoding string) LoggerOption {
- return func(c *loggerConfig) {
- c.encoding = encoding
- }
- }
- // zapLogger Zap日志器实现
- type zapLogger struct {
- *zap.Logger
- }
- // NewLogger 创建新的日志器
- func NewLogger(opts ...LoggerOption) (Logger, error) {
- config := &loggerConfig{
- level: zapcore.InfoLevel,
- development: false,
- encoding: "json",
- outputPaths: []string{"stdout"},
- }
- for _, opt := range opts {
- opt(config)
- }
- zapConfig := zap.Config{
- Level: zap.NewAtomicLevelAt(config.level),
- Development: config.development,
- Encoding: config.encoding,
- EncoderConfig: zapcore.EncoderConfig{
- TimeKey: "timestamp",
- LevelKey: "level",
- NameKey: "logger",
- CallerKey: "caller",
- FunctionKey: zapcore.OmitKey,
- MessageKey: "message",
- StacktraceKey: "stacktrace",
- LineEnding: zapcore.DefaultLineEnding,
- EncodeLevel: zapcore.LowercaseLevelEncoder,
- EncodeTime: zapcore.ISO8601TimeEncoder,
- EncodeDuration: zapcore.SecondsDurationEncoder,
- EncodeCaller: zapcore.ShortCallerEncoder,
- },
- OutputPaths: config.outputPaths,
- ErrorOutputPaths: []string{"stderr"},
- }
- logger, err := zapConfig.Build()
- if err != nil {
- return nil, fmt.Errorf("failed to build zap logger: %w", err)
- }
- return &zapLogger{Logger: logger}, nil
- }
- // Debug 记录调试日志
- func (l *zapLogger) Debug(msg string, fields ...zap.Field) {
- l.Logger.Debug(msg, fields...)
- }
- // Info 记录信息日志
- func (l *zapLogger) Info(msg string, fields ...zap.Field) {
- l.Logger.Info(msg, fields...)
- }
- // Warn 记录警告日志
- func (l *zapLogger) Warn(msg string, fields ...zap.Field) {
- l.Logger.Warn(msg, fields...)
- }
- // Error 记录错误日志
- func (l *zapLogger) Error(msg string, fields ...zap.Field) {
- l.Logger.Error(msg, fields...)
- }
- // Fatal 记录致命日志
- func (l *zapLogger) Fatal(msg string, fields ...zap.Field) {
- l.Logger.Fatal(msg, fields...)
- }
- // With 创建带有额外字段的日志器
- func (l *zapLogger) With(fields ...zap.Field) Logger {
- return &zapLogger{Logger: l.Logger.With(fields...)}
- }
- // Named 创建带有名称的日志器
- func (l *zapLogger) Named(name string) Logger {
- return &zapLogger{Logger: l.Logger.Named(name)}
- }
- // Sync 同步日志输出
- func (l *zapLogger) Sync() error {
- return l.Logger.Sync()
- }
|