Rumah >pembangunan bahagian belakang >Golang >Cara menggunakan fail konfigurasi untuk mengkonfigurasi Logger dengan elegan dan menyokong putaran log
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.
test1()
是官方文档推荐的日志轮转和切割库ngopkg.in/natefinch/lumberjack.v2
. 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.
Kedua-dua menyokong menggunakan fail konfigurasi config_log_zap.yaml
让所有配置生效,并让lumberjack
untuk melengkapkan putaran dan pemisahan log.
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”}
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'
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!