Имя функции Uber Zap logger в журналах

#go #logging #uber-zap

#Вперед #ведение журнала #go-zap

Вопрос:

Как получить имя функции, напечатанное в журналах из Uber Zap logging? Это запрос PR, с помощью которого они, похоже, добавили функциональность для вывода имен функций в журнал.

Я использую golang версии 1.15 и go.uber.org/zap v1.16.0

Это мой код:

 package main

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

var logger *zap.Logger

func main() {
    logger := NewLogger()
    logger.Info("Test msg Main")
    TestFunc(logger)
}

func TestFunc(logger *zap.Logger)  {
    logger.Info("Test msg TestFunc")
}

func NewLogger() *zap.Logger {
    config := zap.NewDevelopmentConfig()
    opts := []zap.Option{
        zap.AddCallerSkip(1), // traverse call depth for more useful log lines
        zap.AddCaller(),
    }

    logger, _ = config.Build(opts...)
    return logger
} 

Это результат, который я получаю с добавлением / без добавления AddCaller() опции

 2021-03-01T15:00:02.927-0800    INFO    runtime/proc.go:204     Test msg Main
2021-03-01T15:00:02.927-0800    INFO    cmd/main.go:12  Test msg TestFunc
 

Я ожидаю чего-то вроде

    2021-03-01T15:00:02.927-0800    INFO    runtime/proc.go:204   main  Test msg Main
   2021-03-01T15:00:02.927-0800    INFO    cmd/main.go:12  TestFunc Test msg TestFunc
 

Ответ №1:

По умолчанию предоставленные предварительные настройки кодировщика (NewDevelopmentEncoderConfig, используемые NewDevelopmentConfig, и NewProductionEncoderConfig, используемые NewProductionConfig) не позволяют вести журнал имен функций.

Чтобы включить имя функции, необходимо включить вызывающий (по умолчанию true) и задать непустое значение для config.EncoderConfig.FunctionKey .

Источник: EncoderConfig

 type EncoderConfig struct {
    // Set the keys used for each log entry. If any key is empty, that portion
    // of the entry is omitted.
    ...
    CallerKey     string `json:"callerKey" yaml:"callerKey"`
    FunctionKey   string `json:"functionKey" yaml:"functionKey"` // this needs to be set
    StacktraceKey string `json:"stacktraceKey" yaml:"stacktraceKey"`
    ...
}
 

Пример консольного регистратора:

 func main() {
    config := zap.NewDevelopmentConfig()
    // if you're using console encoding, the FunctionKey value can be any
    // non-empty string because console encoding does not print the key.
    config.EncoderConfig.FunctionKey = "F"
    logger, _ := config.Build()
    logger.Info("Test Logging")
    // Output: 2021-03-03T11:41:47.728 0800    INFO    example/main.go:11     main.main       Test Logging
}
 

Пример JSON Logger:

 func main() {
    config := zap.NewProductionConfig()
    // the FunctionKey value matters because it will become the JSON field
    config.EncoderConfig.FunctionKey = "func"
    logger, _ := config.Build()
    log(logger)
    // Output: {"level":"info","ts":1614743088.538128,"caller":"example/main.go:15","func":"main.log","msg":"Test Logging"}
}

func log(logger *zap.Logger) {
    logger.Info("Test Logging")
}