0

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

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))
    }
}

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

4

2 回答 2

2

使用runtime来电者。

import "runtime"

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

src 和 line 是你需要的。

于 2020-04-16T09:29:45.917 回答
0
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))了这一行并且工作,调用者改变了。

于 2020-11-15T18:13:24.953 回答