195 lines
5.1 KiB
Go
195 lines
5.1 KiB
Go
|
|
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
|
|||
|
|
}
|