logger.go 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. package logger
  2. import (
  3. "fmt"
  4. "go.uber.org/zap"
  5. "go.uber.org/zap/zapcore"
  6. )
  7. // loggerConfig 内部配置结构体
  8. type loggerConfig struct {
  9. level zapcore.Level
  10. development bool
  11. encoding string
  12. outputPaths []string
  13. }
  14. // LoggerOption 配置选项函数类型
  15. type LoggerOption func(*loggerConfig)
  16. // WithLevel 设置日志级别
  17. func WithLevel(level zapcore.Level) LoggerOption {
  18. return func(c *loggerConfig) {
  19. c.level = level
  20. }
  21. }
  22. // WithOutputPaths 设置输出路径
  23. func WithOutputPaths(paths ...string) LoggerOption {
  24. return func(c *loggerConfig) {
  25. c.outputPaths = paths
  26. }
  27. }
  28. // WithDevelopment 设置开发模式
  29. func WithDevelopment(dev bool) LoggerOption {
  30. return func(c *loggerConfig) {
  31. c.development = dev
  32. }
  33. }
  34. // WithEncoding 设置编码格式
  35. func WithEncoding(encoding string) LoggerOption {
  36. return func(c *loggerConfig) {
  37. c.encoding = encoding
  38. }
  39. }
  40. // zapLogger Zap日志器实现
  41. type zapLogger struct {
  42. *zap.Logger
  43. }
  44. // NewLogger 创建新的日志器
  45. func NewLogger(opts ...LoggerOption) (Logger, error) {
  46. config := &loggerConfig{
  47. level: zapcore.InfoLevel,
  48. development: false,
  49. encoding: "json",
  50. outputPaths: []string{"stdout"},
  51. }
  52. for _, opt := range opts {
  53. opt(config)
  54. }
  55. zapConfig := zap.Config{
  56. Level: zap.NewAtomicLevelAt(config.level),
  57. Development: config.development,
  58. Encoding: config.encoding,
  59. EncoderConfig: zapcore.EncoderConfig{
  60. TimeKey: "timestamp",
  61. LevelKey: "level",
  62. NameKey: "logger",
  63. CallerKey: "caller",
  64. FunctionKey: zapcore.OmitKey,
  65. MessageKey: "message",
  66. StacktraceKey: "stacktrace",
  67. LineEnding: zapcore.DefaultLineEnding,
  68. EncodeLevel: zapcore.LowercaseLevelEncoder,
  69. EncodeTime: zapcore.ISO8601TimeEncoder,
  70. EncodeDuration: zapcore.SecondsDurationEncoder,
  71. EncodeCaller: zapcore.ShortCallerEncoder,
  72. },
  73. OutputPaths: config.outputPaths,
  74. ErrorOutputPaths: []string{"stderr"},
  75. }
  76. logger, err := zapConfig.Build()
  77. if err != nil {
  78. return nil, fmt.Errorf("failed to build zap logger: %w", err)
  79. }
  80. return &zapLogger{Logger: logger}, nil
  81. }
  82. // Debug 记录调试日志
  83. func (l *zapLogger) Debug(msg string, fields ...zap.Field) {
  84. l.Logger.Debug(msg, fields...)
  85. }
  86. // Info 记录信息日志
  87. func (l *zapLogger) Info(msg string, fields ...zap.Field) {
  88. l.Logger.Info(msg, fields...)
  89. }
  90. // Warn 记录警告日志
  91. func (l *zapLogger) Warn(msg string, fields ...zap.Field) {
  92. l.Logger.Warn(msg, fields...)
  93. }
  94. // Error 记录错误日志
  95. func (l *zapLogger) Error(msg string, fields ...zap.Field) {
  96. l.Logger.Error(msg, fields...)
  97. }
  98. // Fatal 记录致命日志
  99. func (l *zapLogger) Fatal(msg string, fields ...zap.Field) {
  100. l.Logger.Fatal(msg, fields...)
  101. }
  102. // With 创建带有额外字段的日志器
  103. func (l *zapLogger) With(fields ...zap.Field) Logger {
  104. return &zapLogger{Logger: l.Logger.With(fields...)}
  105. }
  106. // Named 创建带有名称的日志器
  107. func (l *zapLogger) Named(name string) Logger {
  108. return &zapLogger{Logger: l.Logger.Named(name)}
  109. }
  110. // Sync 同步日志输出
  111. func (l *zapLogger) Sync() error {
  112. return l.Logger.Sync()
  113. }