首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从ctrl“Sigs.k8s.io/控制器-运行时”模拟zap记录器?

如何从ctrl“Sigs.k8s.io/控制器-运行时”模拟zap记录器?
EN

Stack Overflow用户
提问于 2021-10-28 12:15:03
回答 1查看 412关注 0票数 1
代码语言:javascript
复制
package logger

import (
    "bytes"
    . "github.com/onsi/ginkgo"
    . "github.com/onsi/gomega"
    ctrl "sigs.k8s.io/controller-runtime"
)
var _ = Describe("Logger", func() {
    It("Test Default Log Level", func() {
        buf := &bytes.Buffer{}
        testLog := ctrl.Log.WithName("setup")
        SetLogger()
        

        testLog.Info("This is a test")
        Expect(buf.String(),"This is a test")
    })
})

这是SetLogger函数,它也用于生产中:

代码语言:javascript
复制
package logger

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

func SetLogger() {
    opts := zap.Options{
        Development:     developmentFlag,
        StacktraceLevel: stacktraceLevel,
        Level:           isLevelEnabler,
        Encoder:         logFmtEncoder,
    }
  ctrl.SetLogger(zap.New(zap.UseFlagOptions(&opts)))
}

如何将testLog.Info的输出更改为缓冲区?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-10-28 12:54:16

如果您只对测试日志消息感兴趣,则可以使用钩子。

特别地,zap.Hooks函数从可变数量的钩子构造zap.Option。钩子只是一个func(entry zapcore.Entry) error,您可以使用它来拦截条目并将其消息写入缓冲区。

若要将此zap.Option设置为sigs.k8s.io记录器,请将其设置为ZapOpts字段:

代码语言:javascript
复制
    opts := k8szap.Options{
        // ...
        ZapOpts: []zap.Option{
            zap.Hooks(func(entry zapcore.Entry) error {
                buf.WriteString(entry.Message)
                return nil
            }),
        },
    }

因此,由于需要访问缓冲区,所以可以将其作为参数传递给SetLogger函数:

代码语言:javascript
复制
func SetLogger(buf *bytes.Buffer) {
    opts := zap.Options{
        Development:     developmentFlag,
        StacktraceLevel: stacktraceLevel,
        Level:           isLevelEnabler,
        Encoder:         logFmtEncoder,

        // here 'zap' selector is 'go.uber.org/zap'
        ZapOpts: []zap.Option{
            zap.Hooks(func(entry zapcore.Entry) error {
                buf.WriteString(entry.Message)
                return nil
            }),
        },
    }
    // here I call 'k8szap' selector the package 'sigs.k8s.io/controller-runtime/pkg/log/zap'
    ctrl.SetLogger(k8szap.New(k8szap.UseFlagOptions(&opts)))
}

然后在您的测试功能中:

代码语言:javascript
复制
    It("Test Default Log Level", func() {
        buf := &bytes.Buffer{}
        testLog := ctrl.Log.WithName("setup")

        // pass buffer to SetLogger
        SetLogger(buf)
        

        testLog.Info("This is a test")
        Expect(buf.String(), "This is a test")
    })

最小示例(在操场下载包时可能超时):https://play.golang.org/p/oBN3SHFKVC8

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69753926

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档