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

王林
Freigeben: 2024-02-10 20:50:08
nach vorne
920 Leute haben es durchsucht

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

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'
Nach dem Login kopieren

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()
}
Nach dem Login kopieren

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

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

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!

Quelle:stackoverflow.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!