- 将所有trustlog-sdk文件移动到trustlog/go-trustlog/目录 - 更新README中所有import路径从trustlog-sdk改为go-trustlog - 更新cookiecutter配置文件中的项目名称 - 更新根目录.lefthook.yml以引用新位置的配置 - 添加go.sum文件到版本控制 - 删除过时的示例文件 这次重构与trustlog-server保持一致的目录结构, 为未来支持多语言SDK(Python、Java等)预留空间。
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
|
||
}
|