Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Cara menggunakan fail konfigurasi untuk mengkonfigurasi Logger dengan elegan dan menyokong putaran log

Cara menggunakan fail konfigurasi untuk mengkonfigurasi Logger dengan elegan dan menyokong putaran log

王林
王林ke hadapan
2024-02-10 20:50:08920semak imbas

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

Editor PHP Zimo akan berkongsi dengan anda cara menggunakan fail konfigurasi untuk mengkonfigurasi Logger secara elegan dan melaksanakan putaran log. Logger ialah alat pengelogan yang biasa digunakan yang boleh membantu kami merekod status berjalan aplikasi untuk memudahkan penyelesaian masalah dan log penjejakan. Apabila menggunakan Logger, anda boleh menentukan format log, sasaran output, tahap log, dsb. secara fleksibel melalui fail konfigurasi Anda juga boleh mengkonfigurasi peraturan putaran log untuk mencapai pengurusan automatik dan penyimpanan log. Melalui konfigurasi yang munasabah, kami boleh mencapai pembalakan dan pengurusan yang lebih fleksibel dan cekap. Dalam artikel ini, kami akan memperkenalkan secara terperinci cara menggunakan fail konfigurasi untuk mengkonfigurasi Logger secara elegan dan menyokong putaran log.

Kandungan masalah

Penerangan masalah

  • Ciri-ciri:test1()是官方文档推荐的日志轮转和切割库ngopkg.in/natefinch/lumberjack.v2.
  • Fungsi: test2() ialah logger yang menggunakan yaml untuk membaca konfigurasi mengikut konfigurasi asas dalam dokumen rasmi.

Selepas melaksanakan fungsi utama,

Output dalam konsol:

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

Output dalam fail log foo.log:

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

Dua balak ini pasti berbeza.

Keperluan semasa saya:

  1. Kedua-dua menyokong menggunakan fail konfigurasi config_log_zap.yaml让所有配置生效,并让lumberjack untuk melengkapkan putaran dan pemisahan log.

  2. Output kepada fail konsol dan log hendaklah sama supaya saya boleh menggunakan apa yang saya perlukan dengan cepat melalui fail konfigurasi. Konsol dan fail log diperlukan kerana saya perlu mengikuti dan merekodkan mesej keluaran lalu semasa pembangunan.

    Output dalam konsol:

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

    Output dalam fail log foo.log:

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

  3. Bagaimana untuk menggabungkan test1() dan test1()test2() 合并为一个函数 test0() ke dalam satu fungsi test0() untuk memenuhi dua keperluan di atas?

Tolong bantu saya, saya sudah lama mengusahakannya.

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'

Penyelesaian

Gunakan zap.registersink untuk mendaftarkan lumberjack pembalak sebagai sinki baharu:

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

Dan ubah suai fail konfigurasi untuk ditetapkan outputpaths seperti berikut:

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

Atas ialah kandungan terperinci Cara menggunakan fail konfigurasi untuk mengkonfigurasi Logger dengan elegan dan menyokong putaran log. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam