将 ecszap 记录器与 Kubernetes 控制器运行时结合使用

问题描述 投票:0回答:1

我正在努力登录使用以下构建的 Kubernetes 运算符:

  • KubeBuilder版本:3.7.0
  • go版本:go1.20.1 linux/amd64

到目前为止,出于记录目的,我已经使用了 zap 记录器包(“sigs.k8s.io/controller-runtime/pkg/log/zap”)并且工作正常。

最近出现了使日志记录与 Elasticsearch 更加兼容的需求,因此建议使用 ecs 记录器。我已经在一个简单的 go 应用程序中尝试了here列出的示例,它工作正常。

下一步是用 ecs 替换操作员代码中现有的 zap 日志记录设置,而此时进度就陷入了停滞。

当前设置:

"sigs.k8s.io/controller-runtime/pkg/log/zap"  
ctrl "sigs.k8s.io/controller-runtime"

opts := zap.Options{
    Development: true,
}
opts.BindFlags(flag.CommandLine)

ctrl.SetLogger(zap.New(zap.UseFlagOptions(&opts)))

ctrl.SetLogger
需要一个
logr.Logger
类型的参数,而这也正是
zap.New(zap.UseFlagOptions(&opts))
返回的内容 – 所以一切都运行良好。

*** 安装尝试使用 ecszap 记录器 ***
再次使用here所述的 ecszap 示例,我最终得到以下结果:

ctrl "sigs.k8s.io/controller-runtime"  
ecszap "go.elastic.co/ecszap"  
uzap "go.uber.org/zap"  

encoderConfig := ecszap.NewDefaultEncoderConfig()
core := ecszap.NewCore(encoderConfig, os.Stdout, uzap.DebugLevel)
logger := uzap.New(core, uzap.AddCaller())

uzap.New(core, uzap.AddCaller())
返回指向
type Logger struct
的指针。 (据我所知)这不是
ctrl.SetLogger
所期望的(它需要
logr.Logger
),然后它显然会因类型不匹配而失败。

我的问题是: 连接 ecszap 记录器以供操作员使用的正确方法是什么?

任何帮助将不胜感激。
非常感谢!

go elasticsearch kubernetes kubebuilder go-zap
1个回答
0
投票
import (
    "go.elastic.co/ecszap"
    "go.uber.org/zap"
    "go.uber.org/zap/zapcore"
    ctrl "sigs.k8s.io/controller-runtime"
    crzap "sigs.k8s.io/controller-runtime/pkg/log/zap"
)

func ecsCompatibleEncoderConfig(ecfg *zapcore.EncoderConfig) {
    *ecfg = ecszap.ECSCompatibleEncoderConfig(*ecfg)
}

var ecsWrapCore = zap.WrapCore(func(core zapcore.Core) zapcore.Core {
    return ecszap.WrapCore(core)
})

func setup() {
    opts := crzap.Options{
        EncoderConfigOptions: []crzap.EncoderConfigOption{ecsCompatibleEncoderConfig},
        ZapOpts:              []zap.Option{ecsWrapCore},
    }
    logger := crzap.New(crzap.UseFlagOptions(&opts))
    ctrl.SetLogger(logger)
}
© www.soinside.com 2019 - 2024. All rights reserved.