登录
首页 >  Golang >  Go问答

如何在ctrl“sigs.k8s.io/controller-runtime”中模拟zap日志记录器?

来源:stackoverflow

时间:2024-02-19 21:45:24 305浏览 收藏

本篇文章向大家介绍《如何在ctrl“sigs.k8s.io/controller-runtime”中模拟zap日志记录器?》,主要包括,具有一定的参考价值,需要的朋友可以参考一下。

问题内容

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 函数,它也在生产中使用:

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 的输出更改为缓冲区?


正确答案


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

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

要将此 zap.option 设置到 sigs.k8s.io 记录器中,请将其设置为 zapopts 字段:

opts := k8szap.options{
        // ...
        zapopts: []zap.option{
            zap.hooks(func(entry zapcore.entry) error {
                buf.writestring(entry.message)
                return nil
            }),
        },
    }

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

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

然后在你的测试函数中:

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

文中关于的知识介绍,希望对你的学习有所帮助!若是受益匪浅,那就动动鼠标收藏这篇《如何在ctrl“sigs.k8s.io/controller-runtime”中模拟zap日志记录器?》文章吧,也可关注golang学习网公众号了解相关技术文章。

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>