Maison >développement back-end >Golang >Comment utiliser les fichiers de configuration pour configurer Logger avec élégance et prendre en charge la rotation des journaux

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

王林
王林avant
2024-02-10 20:50:08970parcourir

如何使用配置文件优雅地配置 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()
}

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'

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

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

outputPaths:
  - stdout
  - lumberjack://localhost/foo.log?maxSize=500&maxBackups=3&maxAge=28

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