ホームページ  >  記事  >  バックエンド開発  >  構成ファイルを使用して、ログのローテーションをサポートしながら Logger をエレガントに構成する方法

構成ファイルを使用して、ログのローテーションをサポートしながら Logger をエレガントに構成する方法

王林
王林転載
2024-02-10 20:50:08920ブラウズ

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

php エディター Zimo は、構成ファイルを使用して Logger をエレガントに構成し、ログ ローテーションを実装する方法を共有します。 Logger は、アプリケーションの実行ステータスを記録して、トラブルシューティングやログの追跡を容易にするために役立つ、一般的に使用されるログ ツールです。 Loggerを利用する場合、ログの形式や出力対象、ログレベルなどを設定ファイルで柔軟に定義したり、ログのローテーションルールを設定したりすることで、ログの自動管理や保存を実現できます。合理的な構成により、より柔軟で効率的なロギングと管理を実現できます。この記事では、構成ファイルを使用して Logger をエレガントに構成し、ログのローテーションをサポートする方法を詳しく紹介します。

質問内容

問題の説明

  • 関数: test1() は、公式ドキュメント ngopkg.in/natefinch/lumberjack.v2 で推奨されている丸太の回転および切断ライブラリです。
  • 関数: test2() は、公式ドキュメントの基本設定に従って yaml を使用して設定を読み取るロガーです。

main関数の実行後、

コンソールの出力:

2023-05-15t08:49:16.555 0800 |info|ロガーのビルドが成功しました: yaml からの設定 | {"app":"jpz"}

ログ ファイル foo.log:

への出力

{"level":"info","ts":1684111756.5545945,"msg":"ロガーが正常に構築されました: lumberjack.logger"}

これら 2 つのログは明らかに異なります。

私の現在の要件:

  1. どちらも、構成ファイル config_log_zap.yaml を使用してすべての構成を有効にし、lumberjack がログのローテーションと分割作業を完了できるようにすることをサポートしています。

  2. コンソールとログ ファイルの出力は同じである必要があるため、構成ファイルを介して必要なものをすぐに適用できます。開発中に過去の出力メッセージを追跡して記録する必要があるため、コンソール ファイルとログ ファイルが必要です。

    コンソールの出力:

    2023-05-15t08:49:16.555 0800 |info|ロガーのビルドが成功しました: yaml からの設定 | {"app":"jpz"}

    ログ ファイル foo.log:

    への出力

    2023-05-15t08:49:16.555 0800 |info|ロガーのビルドが成功しました: yaml からの設定 | {"app":"jpz"}

  3. 上記 2 つの要件を満たすために、test1()test2() を 1 つの関数 test0() に結合するにはどうすればよいですか?

助けてください。私はこれに長い間取り組んできました。

main.go

リーリー

config_log_zap.yaml

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

回避策

zap.registersinkを使用して、lumberjackロガーを新しいシンクとして登録します:

リーリー

そして、構成ファイルを変更して、outputpaths を次のように設定します:

リーリー

以上が構成ファイルを使用して、ログのローテーションをサポートしながら Logger をエレガントに構成する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はstackoverflow.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。