我正在努力登录使用以下构建的 Kubernetes 运算符:
到目前为止,出于记录目的,我已经使用了 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 记录器以供操作员使用的正确方法是什么?
任何帮助将不胜感激。
非常感谢!
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)
}