Heim  >  Artikel  >  Backend-Entwicklung  >  Ist es möglich, die Protokollebene des Zap-Loggers zur Laufzeit zu aktualisieren?

Ist es möglich, die Protokollebene des Zap-Loggers zur Laufzeit zu aktualisieren?

王林
王林nach vorne
2024-02-08 23:20:31989Durchsuche

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

Es ist eine häufige Anforderung für den PHP-Editor Xigua, die Protokollebene des Zap-Recorders zur Laufzeit zu aktualisieren. zap ist ein leistungsstarkes Protokollierungstool, mit dem wir Informationen zur Anwendungsausführung erfassen und aufzeichnen können. Normalerweise müssen wir die Protokollebene von zap festlegen, wenn die Anwendung gestartet wird. Manchmal möchten wir jedoch die Protokollebene zur Laufzeit dynamisch aktualisieren können, um sie an die tatsächlichen Anforderungen anzupassen. In Zap können wir diese Funktion erreichen, indem wir die Methoden verwenden, die von der Logger-Schnittstelle von Zap bereitgestellt werden. Konkret können wir „zap.Info()“, „zap.Debug()“, „zap.Warn()“ und andere Methoden verwenden, um die Protokollebene dynamisch zu aktualisieren. Auf diese Weise können wir das Protokollierungsverhalten von zap zur Laufzeit je nach Bedarf flexibel anpassen.

Frageninhalt

Ich habe mit kubebuilder einen Logger erstellt, der auf dem Zap-Logger basiert:

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

Jetzt möchte ich die Protokollebene zur Laufzeit auf zapcore.infolevel 。我没有找到任何 setloglevel oder eine ähnliche API ändern.

Muss ich neue Optionen erstellen und dann neue Ebenen festlegen?

Ich muss den Logger auch mit sigs.k8s.io/controller-runtime/pkg/log/zap 库设置记录器。记录器的接口来自go-logr,它实现了logr.logger接口。如果我尝试将其更改为 zapcore.newcore ,我将无法再使用 ctrl.setlogger einrichten.

Ich möchte den Zap von Updates fernhalten zap.options 的所有选项的选项,并更改日志级别,并且仍然使用 sigs.k8s.io/controller-runtime/pkg/log/zap.

Ist das möglich? sigs.k8s.io/controller-runtime/pkg/log/zap und sigs.k8s.io/controller-runtime? sigs.k8s.io/controller-runtime

解决方法

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

Workaround

levelenabler 函数创建核心。您可以使用 zap.levelenablerfunc 将闭包转换为 zapcore.levelenablerBessere Antwort: Befolgen Sie den Vorschlag von @oliver dain und verwenden Sie zap.atomiclevel. Einzelheiten finden Sie in den Antworten.

Eine andere Möglichkeit besteht darin, benutzerdefinierte

zu verwenden.

Zugehörige Dokumente:

levelenabler bestimmt, ob eine bestimmte Protokollierungsstufe beim Protokollieren von Nachrichten aktiviert ist. truefalse

levelenablerfunc ist eine praktische Möglichkeit, zapcore.levelenabler mithilfe einer anonymen Funktion zu implementieren.

infoenabledDie Funktion kann

Folgendes zurückgeben:

basierend auf anderen Variablen, die sich während der Laufzeit ändern

// 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: Dieser Code ist künstlich. Ihr Programm muss die Initialisierung, Laufzeitwertänderungen und eine ordnungsgemäße Synchronisierung (falls erforderlich) für -Variablen implementieren.

🎜Sie können dieses Beispiel auf dem Spielplatz ausführen: 🎜https://play.golang.org/p/ot3nvnp1bwc🎜🎜

Das obige ist der detaillierte Inhalt vonIst es möglich, die Protokollebene des Zap-Loggers zur Laufzeit zu aktualisieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen