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

王林
Lepaskan: 2024-02-10 20:50:08
ke hadapan
920 orang telah melayarinya

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

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'
Salin selepas log masuk

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()
}
Salin selepas log masuk

Dan ubah suai fail konfigurasi untuk ditetapkan outputpaths seperti berikut:

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

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!

sumber:stackoverflow.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!