Describe the feature

在自定义的logger接口中传入 context,如下所示

type Writer interface {
    Printf(context.Context, string, ...interface{})
}

Motivation

我们在适配gorm的过程中,发现当前的的接口(logger.Writer)并没有将context放进去,而是用了最基本的log.Printf

type Writer interface {
    Printf(string, ...interface{})
}

gorm内部logger使用时,其实是带 context的,但并没有作为接口的入参

// Info print info
func (l logger) Info(ctx context.Context, msg string, data ...interface{}) {
    if l.LogLevel >= Info {
        l.Printf(l.infoStr+msg, append([]interface{}{utils.FileWithLineNum()}, data...)...)
    }
}

// Warn print warn messages
func (l logger) Warn(ctx context.Context, msg string, data ...interface{}) {
    if l.LogLevel >= Warn {
        l.Printf(l.warnStr+msg, append([]interface{}{utils.FileWithLineNum()}, data...)...)
    }
}

// Error print error messages
func (l logger) Error(ctx context.Context, msg string, data ...interface{}) {
    if l.LogLevel >= Error {
        l.Printf(l.errStr+msg, append([]interface{}{utils.FileWithLineNum()}, data...)...)
    }
}

我们仔细阅读了相关代码,认为最初是有考虑放入context的例如 Info、Warn、Error都是带 context,但后期实现时,迁就了默认的log.Printf

这就导致我们无法对context内部封装的数据(traceID等)进行展开输出,无法定位整个链路,所以这里希望能将 context.Context 放入接口中