package logger import ( "fmt" "github.com/ThreeDotsLabs/watermill" "github.com/apache/pulsar-client-go/pulsar/log" "go.yandata.net/iod/iod/trustlog-sdk/api/logger" ) const ( // argsPerField 每个字段转换为args时的参数数量(key+value). argsPerField = 2 ) type WatermillLoggerAdapter struct { logger logger.Logger fields watermill.LogFields } func (w WatermillLoggerAdapter) Error(msg string, err error, fields watermill.LogFields) { allFields := mergeFields(w.fields, fields) args := allFieldsToArgs(allFields) w.logger.Error(fmt.Sprintf("%s: %v", msg, err), args...) } func (w WatermillLoggerAdapter) Info(msg string, fields watermill.LogFields) { allFields := mergeFields(w.fields, fields) args := allFieldsToArgs(allFields) w.logger.Info(msg, args...) } func (w WatermillLoggerAdapter) Debug(msg string, fields watermill.LogFields) { allFields := mergeFields(w.fields, fields) args := allFieldsToArgs(allFields) w.logger.Debug(msg, args...) } func (w WatermillLoggerAdapter) Trace(msg string, fields watermill.LogFields) { allFields := mergeFields(w.fields, fields) args := allFieldsToArgs(allFields) w.logger.Debug(fmt.Sprintf("[TRACE] %s", msg), args...) } func (w WatermillLoggerAdapter) With(fields watermill.LogFields) watermill.LoggerAdapter { newFields := mergeFields(w.fields, fields) return WatermillLoggerAdapter{ logger: w.logger, fields: newFields, } } //nolint:funcorder // 构造函数放在此处更符合代码组织 func NewWatermillLoggerAdapter(logger logger.Logger) *WatermillLoggerAdapter { return &WatermillLoggerAdapter{logger: logger, fields: watermill.LogFields{}} } func mergeFields(base, extra watermill.LogFields) watermill.LogFields { merged := make(watermill.LogFields, len(base)+len(extra)) for k, v := range base { merged[k] = v } for k, v := range extra { merged[k] = v } return merged } func allFieldsToArgs(fields watermill.LogFields) []any { args := make([]any, 0, len(fields)*argsPerField) for k, v := range fields { args = append(args, k, v) } return args } // ================= PulsarLoggerAdapter ====================== type PulsarLoggerAdapter struct { logger logger.Logger fields log.Fields err error } func NewPulsarLoggerAdapter(l logger.Logger) *PulsarLoggerAdapter { return &PulsarLoggerAdapter{logger: l, fields: log.Fields{}} } func (p PulsarLoggerAdapter) SubLogger(fields log.Fields) log.Logger { return PulsarLoggerAdapter{ logger: p.logger, fields: mergePulsarFields(p.fields, fields), err: p.err, } } func (p PulsarLoggerAdapter) WithFields(fields log.Fields) log.Entry { return PulsarLoggerAdapter{ logger: p.logger, fields: mergePulsarFields(p.fields, fields), err: p.err, } } func (p PulsarLoggerAdapter) WithField(name string, value interface{}) log.Entry { newFields := mergePulsarFields(p.fields, log.Fields{name: value}) return PulsarLoggerAdapter{ logger: p.logger, fields: newFields, err: p.err, } } func (p PulsarLoggerAdapter) WithError(err error) log.Entry { return PulsarLoggerAdapter{ logger: p.logger, fields: p.fields, err: err, } } func (p PulsarLoggerAdapter) Debug(args ...interface{}) { fieldsArgs := fieldsToArgs(p.fields) p.logger.Debug(fmt.Sprint(args...), fieldsArgs...) } func (p PulsarLoggerAdapter) Info(args ...interface{}) { fieldsArgs := fieldsToArgs(p.fields) p.logger.Info(fmt.Sprint(args...), fieldsArgs...) } func (p PulsarLoggerAdapter) Warn(args ...interface{}) { fieldsArgs := fieldsToArgs(p.fields) p.logger.Warn(fmt.Sprint(args...), fieldsArgs...) } func (p PulsarLoggerAdapter) Error(args ...interface{}) { msg := fmt.Sprint(args...) fieldsArgs := fieldsToArgs(p.fields) if p.err != nil { // 将error作为key-value对添加到args中 fieldsArgs = append(fieldsArgs, "error", p.err) p.logger.Error(msg, fieldsArgs...) } else { p.logger.Error(msg, fieldsArgs...) } } func (p PulsarLoggerAdapter) Debugf(format string, args ...interface{}) { fieldsArgs := fieldsToArgs(p.fields) p.logger.Debug(fmt.Sprintf(format, args...), fieldsArgs...) } func (p PulsarLoggerAdapter) Infof(format string, args ...interface{}) { fieldsArgs := fieldsToArgs(p.fields) p.logger.Info(fmt.Sprintf(format, args...), fieldsArgs...) } func (p PulsarLoggerAdapter) Warnf(format string, args ...interface{}) { fieldsArgs := fieldsToArgs(p.fields) p.logger.Warn(fmt.Sprintf(format, args...), fieldsArgs...) } func (p PulsarLoggerAdapter) Errorf(format string, args ...interface{}) { msg := fmt.Sprintf(format, args...) fieldsArgs := fieldsToArgs(p.fields) if p.err != nil { p.logger.Error(fmt.Sprintf("%s: %v", msg, p.err), fieldsArgs...) } else { p.logger.Error(msg, fieldsArgs...) } } // 合并 Pulsar log.Fields. func mergePulsarFields(base, extra log.Fields) log.Fields { merged := make(log.Fields, len(base)+len(extra)) for k, v := range base { merged[k] = v } for k, v := range extra { merged[k] = v } return merged } // 将 Pulsar log.Fields 转为 args ...any 形式,适配 Adapter. func fieldsToArgs(fields log.Fields) []any { args := make([]any, 0, len(fields)*argsPerField) for k, v := range fields { args = append(args, k, v) } return args }