Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Adakah mungkin untuk mengemas kini tahap log logger zap pada masa jalan?

Adakah mungkin untuk mengemas kini tahap log logger zap pada masa jalan?

王林
王林ke hadapan
2024-02-08 23:20:311047semak imbas

是否可以在运行时更新 zap 记录器的日志级别?

Ini adalah keperluan biasa bagi editor PHP Xigua untuk mengemas kini tahap log perakam zap semasa masa jalan. zap ialah alat pengelogan yang berkuasa yang boleh membantu kami menangkap dan merekod maklumat yang sedang berjalan aplikasi. Biasanya, kita perlu menetapkan tahap log zap apabila aplikasi dimulakan, tetapi kadangkala kita mahu dapat mengemas kini tahap log secara dinamik semasa masa jalan untuk melaraskannya mengikut keperluan sebenar. Dalam zap, kita boleh mencapai fungsi ini dengan menggunakan kaedah yang disediakan oleh antara muka Logger zap. Khususnya, kita boleh menggunakan `zap.Info()`, `zap.Debug()`, `zap.Warn()` dan kaedah lain untuk mengemas kini tahap log secara dinamik. Dengan cara ini, kami boleh melaraskan gelagat pengelogan zap secara fleksibel pada masa jalan mengikut keperluan.

Kandungan soalan

Saya mencipta pembalak menggunakan kubebuilder yang berdasarkan pada logger zap:

import (
    "flag"
    "github.com/gin-gonic/gin"
    "net/http"
    "os"
    "go.uber.org/zap/zapcore"
    uzap "go.uber.org/zap"
    // Import all Kubernetes client auth plugins (e.g. Azure, GCP, OIDC, etc.)
    // to ensure that exec-entrypoint and run can make use of them.
    _ "k8s.io/client-go/plugin/pkg/client/auth"

    "k8s.io/apimachinery/pkg/runtime"
    utilruntime "k8s.io/apimachinery/pkg/util/runtime"
    clientgoscheme "k8s.io/client-go/kubernetes/scheme"
    ctrl "sigs.k8s.io/controller-runtime"
    "sigs.k8s.io/controller-runtime/pkg/healthz"
    "sigs.k8s.io/controller-runtime/pkg/log/zap"

)

var (
    scheme   = runtime.NewScheme()
    setupLog = ctrl.Log.WithName("setup")
)

var zapOpts []uzap.Option
    zapOpts = append(zapOpts, uzap.AddCaller())
    zapOpts = append(zapOpts, uzap.AddCallerSkip(1))
    zapOpts = append(zapOpts, uzap.AddStacktrace(uzap.DebugLevel))

    opts := zap.Options{
        Development:     developmentFlag,
        StacktraceLevel: stacktraceLevel,
        Level:           level,
        Encoder:         encoder,
        ZapOpts:  zapOpts,
    }

    opts.BindFlags(flag.CommandLine)
    flag.Parse()

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

Sekarang saya mahu menukar tahap log semasa runtime kepada zapcore.infolevel 。我没有找到任何 setloglevel atau api yang serupa.

Adakah saya perlu membuat pilihan baharu dan kemudian menetapkan tahap baharu?

Saya juga perlu menyediakan pembalak menggunakan sigs.k8s.io/controller-runtime/pkg/log/zap 库设置记录器。记录器的接口来自go-logr,它实现了logr.logger接口。如果我尝试将其更改为 zapcore.newcore ,我将无法再使用 ctrl.setlogger.

Saya mahu menyimpan zap daripada kemas kini zap.options 的所有选项的选项,并更改日志级别,并且仍然使用 sigs.k8s.io/controller-runtime/pkg/log/zap.

Adakah mungkin untuk melakukan ini? sigs.k8s.io/controller-runtime/pkg/log/zap dan sigs.k8s.io/controller-runtime? . /kod>. Lihat jawapan mereka untuk butiran. sigs.k8s.io/controller-runtime

解决方法

更好的答案:按照@oliver dain的建议,使用 zap.atomiclevel

Pilihan lain ialah menggunakan tersuai

levelenabler 函数创建核心。您可以使用 zap.levelenablerfunc 将闭包转换为 zapcore.levelenabler.

Dokumen berkaitan:

levelenabler menentukan sama ada tahap pengelogan tertentu didayakan semasa mengelog mesej.

levelenablerfunc ialah cara mudah untuk melaksanakan zapcore.levelenabler menggunakan fungsi tanpa nama.

Fungsi mungkin kembali

: truefalse berdasarkan pembolehubah lain yang berubah semasa masa jalan

// will be actually initialized and changed at run time 
    // based on your business logic
    var infoEnabled bool 

    errorUnlessEnabled := zap.LevelEnablerFunc(func(level zapcore.Level) bool {
        // true: log message at this level
        // false: skip message at this level
        return level >= zapcore.ErrorLevel || infoEnabled
    })

    core := zapcore.NewCore(
        zapcore.NewJSONEncoder(zap.NewProductionEncoderConfig()),
        os.Stdout,
        errorUnlessEnabled,
    )
    logger := zap.New(core)

    logger.Info("foo") // not logged
    
    infoEnabled = true

    logger.Info("foo again") // logged

ps: Kod ini adalah tiruan. Program anda mesti melaksanakan pemulaan, perubahan nilai masa jalan dan penyegerakan yang betul (jika perlu) pada

pembolehubah. infoenabled

Anda boleh menjalankan contoh ini di taman permainan:

https://play.golang.org/p/ot3nvnp1bwc

Atas ialah kandungan terperinci Adakah mungkin untuk mengemas kini tahap log logger zap pada masa jalan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam