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