Zap 记录器源代码行

Zap logger source line

如何使用 zap 打印确切的源代码行。我创建了一个包,它存储变量(zap 记录器)。该全局变量将在该包的函数内部调用。 问题是它没有打印实际的调用者,而是调用记录器在记录器包内调用内部函数的地方。这是我的代码:

package log

import (
    zap "go.uber.org/zap"
)

var logger        *zap.Logger

func Init() {
    logger,_ = zap.NewDevelopment()
}

func Info(msg interface{}) {
    if v,ok := msg.(string); ok {
        logger.Info(v) // when I called this function it always print the caller from this line, not the caller outside who actually called this function.
    } else {
        logger.Info(fmt.Sprintf("%v",msg))
    }
}

为实际调用者打印源行值的解决方法是什么?

使用runtime来电者。

import "runtime"

// call below line inside your Info function.
pc, src, line, ok := runtime.Caller(1)

src 和 line 是你需要的。

var (
    //APP_ENV for config
    APP_ENV = "APP_ENV"
)

func init() {
    BuildLogger(os.Getenv(APP_ENV))
}

// BuildLogger builds log config
func BuildLogger(env string) {
    var outputPaths []string
    var level zapcore.Level

    if env == "development" || env == "" {
        outputPaths = []string{"stdout"}
        level = zapcore.DebugLevel
    } else if env == "production" {
        outputPaths = setOutputPaths()
        level = zapcore.InfoLevel
    }

    config = zap.Config{
        Level:       zap.NewAtomicLevelAt(level),
        Development: false,
        Sampling: &zap.SamplingConfig{
            Initial:    100,
            Thereafter: 100,
        },
        Encoding:         "json",
        EncoderConfig:    zap.NewProductionEncoderConfig(),
        OutputPaths:      outputPaths,
        ErrorOutputPaths: []string{"stderr"},
    }

    logger, err := config.Build(zap.AddCallerSkip(1))
    if err != nil {
        panic(err)
    }

    log = logger.Sugar()
}

这是我的记录器配置。添加了 logger, err := config.Build(zap.AddCallerSkip(1)) 这一行并起作用了,来电者改变了。