Maison > développement back-end > Golang > le corps du texte

Comment utiliser les fichiers de configuration pour configurer Logger avec élégance et prendre en charge la rotation des journaux

王林
Libérer: 2024-02-10 20:50:08
avant
920 Les gens l'ont consulté

如何使用配置文件优雅地配置 Logger,同时支持日志轮转

L'éditeur PHP Zimo partagera avec vous comment utiliser les fichiers de configuration pour configurer élégamment Logger et implémenter la rotation des journaux. Logger est un outil de journalisation couramment utilisé qui peut nous aider à enregistrer l'état d'exécution des applications pour faciliter le dépannage et le suivi des journaux. Lorsque vous utilisez Logger, vous pouvez définir de manière flexible le format du journal, la cible de sortie, le niveau de journalisation, etc. via le fichier de configuration. Vous pouvez également configurer des règles de rotation des journaux pour obtenir une gestion et un stockage automatiques des journaux. Grâce à une configuration raisonnable, nous pouvons obtenir une journalisation et une gestion plus flexibles et plus efficaces. Dans cet article, nous présenterons en détail comment utiliser les fichiers de configuration pour configurer avec élégance Logger et prendre en charge la rotation des journaux.

Contenu du problème

Description du problème

  • Caractéristiques :test1()是官方文档推荐的日志轮转和切割库ngopkg.in/natefinch/lumberjack.v2.
  • Fonction : test2() est un enregistreur qui utilise yaml pour lire la configuration selon la configuration de base dans le document officiel.

Après avoir exécuté la fonction principale,

Sortie dans la console :

2023-05-15t08:49:16.555+0800 |信息|记录器构建成功:来自 yaml 的配置 | {“app”:“jpz”}

Sortie dans le fichier journal foo.log :

{"level":"info","ts":1684111756.5545945,"msg":"记录器构建成功:lumberjack.logger"}

Ces deux journaux sont définitivement différents.

Mes exigences actuelles :

  1. Les deux prennent en charge l'utilisation de fichiers de configuration config_log_zap.yaml让所有配置生效,并让lumberjack pour effectuer la rotation et le fractionnement des journaux.

  2. La sortie vers la console et le fichier journal doit être la même afin que je puisse appliquer rapidement ce dont j'ai besoin via le fichier de configuration. La console et les fichiers journaux sont nécessaires car je dois suivre et enregistrer les messages de sortie passés pendant le développement.

    Sortie dans la console :

    2023-05-15t08:49:16.555+0800 |信息|记录器构建成功:来自 yaml 的配置 | {“app”:“jpz”}

    Sortie dans le fichier journal foo.log :

    2023-05-15t08:49:16.555+0800 |信息|记录器构建成功:来自 yaml 的配置 | {“app”:“jpz”}

  3. Comment combiner test1() et test1()test2() 合并为一个函数 test0() en une seule fonction test0() pour satisfaire les deux exigences ci-dessus ?

S'il vous plaît, aidez-moi, je travaille là-dessus depuis longtemps.

main.go

package main

import (
    "gopkg.in/yaml.v3"
    "os"

    "go.uber.org/zap"
    "go.uber.org/zap/zapcore"
    "gopkg.in/natefinch/lumberjack.v2"
)

func test1() {
    // lumberjack.logger is already safe for concurrent use, so we don't need to
    // lock it.
    w := zapcore.addsync(&lumberjack.logger{
        filename:   "./foo.log",
        maxsize:    500, // megabytes
        maxbackups: 3,
        maxage:     28, // days
    })
    core := zapcore.newcore(
        zapcore.newjsonencoder(zap.newproductionencoderconfig()),
        w,
        zap.infolevel,
    )
    logger := zap.new(core)
    logger.info("logger construction succeeded:lumberjack.logger")
}

func test2() {
    var cfg zap.config
    yamlfile, _ := os.readfile("./config_log_zap.yaml")
    if err := yaml.unmarshal(yamlfile, &cfg); err != nil {
        panic(err)
    }

    logger := zap.must(cfg.build())
    defer logger.sync()

    logger.info("logger construction succeeded:config from yaml")
}

func main() {
    test1()
    test2()
}
Copier après la connexion

config_log_zap.yaml

# For the full description for the configuration, see
# https://github.com/uber-go/zap/blob/382e2511e51cda8afde24f9e6e741f934308edfa/config.go#L58-L94
level: 'debug'
development: true
disableCaller: true
disableStacktrace: false
sampling:
  initial: 100
  thereafter: 100
encoding: 'console'
encoderConfig:
  messageKey: 'msg'
  levelKey: 'level'
  timeKey: 'ts'
  nameKey: 'logger'
  callerKey: 'caller'
  functionKey: 'function'
  stacktraceKey: 'stacktrace'
  skipLineEnding: false
  lineEnding: "\n"
  levelEncoder: 'capital'
  timeEncoder: 'iso8601'
  durationEncoder: 'string'
  callerEncoder: 'full'
  nameEncoder: 'full'
  consoleSeparator: ' | '
outputPaths:
  - 'stdout'
  - './foo.log'
errorOutputPaths:
  - 'stderr'
  - './error_logs'
initialFields:
  app: 'jpz'
Copier après la connexion

Solution de contournement

Utilisez zap.registersink pour enregistrer le lumberjack enregistreur en tant que nouveau récepteur :

package main

import (
    "net/url"
    "os"
    "strconv"
    "strings"

    "gopkg.in/yaml.v3"

    "go.uber.org/zap"
    "gopkg.in/natefinch/lumberjack.v2"
)

type lumberjacksink struct {
    lumberjack.logger
}

func (l *lumberjacksink) sync() error {
    return nil
}

func parsenumber(s string, fallback int) int {
    v, err := strconv.atoi(s)
    if err == nil {
        return v
    }
    return fallback
}

func test0() {
    if err := zap.registersink("lumberjack", func(u *url.url) (zap.sink, error) {
        // read parameters from url:
        // lumberjack://localhost/foo.log?maxsize=500&maxbackups=3&maxage=28
        filename := strings.trimleft(u.path, "/")
        if filename == "" {
            filename = "foo.log"
        }
        q := u.query()
        l := &lumberjacksink{
            logger: lumberjack.logger{
                filename:   filename,
                maxsize:    parsenumber(q.get("maxsize"), 500),
                maxbackups: parsenumber(q.get("maxbackups"), 3),
                maxage:     parsenumber(q.get("maxage"), 28),
            },
        }
        return l, nil
    }); err != nil {
        panic(err)
    }

    var cfg zap.config
    yamlfile, _ := os.readfile("./config_log_zap.yaml")
    if err := yaml.unmarshal(yamlfile, &cfg); err != nil {
        panic(err)
    }

    logger := zap.must(cfg.build())
    defer logger.sync()

    logger.info("logger construction succeeded:config from yaml")
}

func main() {
    test0()
}
Copier après la connexion

Et modifiez le fichier de configuration pour définir outputpaths comme suit :

outputPaths:
  - stdout
  - lumberjack://localhost/foo.log?maxSize=500&maxBackups=3&maxAge=28
Copier après la connexion

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!

source:stackoverflow.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!