Maison  >  Article  >  développement back-end  >  Est-il possible de mettre à jour le niveau de journalisation du zap logger au moment de l'exécution ?

Est-il possible de mettre à jour le niveau de journalisation du zap logger au moment de l'exécution ?

王林
王林avant
2024-02-08 23:20:31992parcourir

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

Il est courant que l'éditeur PHP Xigua mette à jour le niveau de journalisation de l'enregistreur zap au moment de l'exécution. zap est un puissant outil de journalisation qui peut nous aider à capturer et à enregistrer les informations en cours d'exécution des applications. Normalement, nous devons définir le niveau de journalisation de zap au démarrage de l'application, mais parfois nous souhaitons pouvoir mettre à jour dynamiquement le niveau de journalisation au moment de l'exécution pour l'ajuster en fonction des besoins réels. Dans zap, nous pouvons réaliser cette fonction en utilisant les méthodes fournies par l'interface Logger de zap. Plus précisément, nous pouvons utiliser `zap.Info()`, `zap.Debug()`, `zap.Warn()` et d'autres méthodes pour mettre à jour dynamiquement le niveau de journalisation. De cette façon, nous pouvons ajuster de manière flexible le comportement de journalisation de zap au moment de l'exécution, selon les besoins.

Contenu de la question

J'ai créé un logger en utilisant kubebuilder qui est basé sur le zap logger :

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

Maintenant, je souhaite modifier le niveau de journalisation au moment de l'exécution en zapcore.infolevel 。我没有找到任何 setloglevel ou une API similaire.

Dois-je créer de nouvelles options, puis définir de nouveaux niveaux ?

Je dois également configurer l'enregistreur en utilisant sigs.k8s.io/controller-runtime/pkg/log/zap 库设置记录器。记录器的接口来自go-logr,它实现了logr.logger接口。如果我尝试将其更改为 zapcore.newcore ,我将无法再使用 ctrl.setlogger.

Je souhaite garder le zap des mises à jour zap.options 的所有选项的选项,并更改日志级别,并且仍然使用 sigs.k8s.io/controller-runtime/pkg/log/zap.

Est-il possible de faire cela ? sigs.k8s.io/controller-runtime/pkg/log/zap et sigs.k8s.io/controller-runtime ? sigs.k8s.io/controller-runtime

解决方法

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

Solution

levelenabler 函数创建核心。您可以使用 zap.levelenablerfunc 将闭包转换为 zapcore.levelenablerMeilleure réponse : suite à la suggestion de @oliver dain, utilisez zap.atomiclevel. Voir leurs réponses pour plus de détails.

Une autre option consiste à utiliser la personnalisation

.

Documents associés :

levelenabler détermine si un niveau de journalisation donné est activé lors de la journalisation des messages. truefalse

levelenablerfunc est un moyen pratique d'implémenter zapcore.levelenabler à l'aide d'une fonction anonyme.

infoenabledLa fonction peut renvoyer

 :

en fonction d'autres variables qui changent pendant l'exécution

// 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 : Ce code est artificiel. Votre programme doit implémenter l'initialisation, les modifications des valeurs d'exécution et une synchronisation appropriée (si nécessaire) sur les variables .

🎜Vous pouvez exécuter cet exemple dans la cour de récréation : 🎜https://play.golang.org/p/ot3nvnp1bwc🎜🎜

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer