Heim  >  Artikel  >  Backend-Entwicklung  >  So verwenden Sie Konfigurationsdateien, um Logger elegant zu konfigurieren und gleichzeitig die Protokollrotation zu unterstützen

So verwenden Sie Konfigurationsdateien, um Logger elegant zu konfigurieren und gleichzeitig die Protokollrotation zu unterstützen

王林
王林nach vorne
2024-02-10 20:50:08920Durchsuche

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

PHP-Editor Zimo zeigt Ihnen, wie Sie Konfigurationsdateien verwenden, um Logger elegant zu konfigurieren und die Protokollrotation zu implementieren. Logger ist ein häufig verwendetes Protokollierungstool, mit dem wir den Ausführungsstatus von Anwendungen aufzeichnen können, um die Fehlerbehebung und Protokollverfolgung zu erleichtern. Bei Verwendung von Logger können Sie das Protokollformat, das Ausgabeziel, die Protokollebene usw. flexibel über die Konfigurationsdatei definieren. Sie können auch Protokollrotationsregeln konfigurieren, um eine automatische Verwaltung und Speicherung von Protokollen zu erreichen. Durch eine angemessene Konfiguration können wir eine flexiblere und effizientere Protokollierung und Verwaltung erreichen. In diesem Artikel stellen wir detailliert vor, wie Sie Konfigurationsdateien verwenden, um Logger elegant zu konfigurieren und die Protokollrotation zu unterstützen.

Probleminhalt

Problembeschreibung

  • Eigenschaften:test1()是官方文档推荐的日志轮转和切割库ngopkg.in/natefinch/lumberjack.v2.
  • Funktion: test2() ist ein Logger, der Yaml verwendet, um die Konfiguration gemäß der Grundkonfiguration im offiziellen Dokument zu lesen.

Nachdem die Hauptfunktion ausgeführt wurde,

Ausgabe in der Konsole:

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

Ausgabe in Protokolldatei foo.log:

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

Diese beiden Protokolle sind definitiv unterschiedlich.

Meine aktuellen Anforderungen:

  1. Beide unterstützen die Verwendung von Konfigurationsdateien config_log_zap.yaml让所有配置生效,并让lumberjack, um die Protokollrotation und -aufteilung abzuschließen.

  2. Die Ausgabe an die Konsole und die Protokolldatei sollten gleich sein, damit ich über die Konfigurationsdatei schnell anwenden kann, was ich brauche. Die Konsolen- und Protokolldateien werden benötigt, da ich frühere Ausgabemeldungen während der Entwicklung verfolgen und aufzeichnen muss.

    Ausgabe in der Konsole:

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

    Ausgabe in Protokolldatei foo.log:

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

  3. Wie kombiniere ich test1() und test1()test2() 合并为一个函数 test0() in einer Funktion test0(), um die beiden oben genannten Anforderungen zu erfüllen?

Bitte helfen Sie mir, ich arbeite schon lange daran.

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'

Workaround

Verwenden Sie zap.registersink, um den lumberjack Logger als neue Senke zu registrieren:

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

Und ändern Sie die Konfigurationsdatei, um outputpaths wie folgt festzulegen:

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

Das obige ist der detaillierte Inhalt vonSo verwenden Sie Konfigurationsdateien, um Logger elegant zu konfigurieren und gleichzeitig die Protokollrotation zu unterstützen. 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