Golang logrusログとログのカットパッケージ

Golang logrusログとログのカットパッケージ

本論文では、一般的に使用されるログバンドルを含むログGolang最善の解決策について説明しlogrusどのように組み合わせるか、基本的な使用をファイルのrotatelogsのパッケージ実装に2つの回転切削ログファイルのトピックを。

ログパッケージは、標準ライブラリ関数を提供比較的小さく、カスタムフィールドをログに記録し、その上で追加し、正確なコントロールのログレベルをサポートしていない、使用することができ、ログ処理パッケージについて多くのGolangがあります。多くのログパッケージでは、多くのサードパーティ製のlogrusパッケージを使用することをお勧めします、パッケージには、組み込みのログと完全に互換性があります。logrusは、プラグインをカスタマイズする機能を提供する、最大のGithubの強力なログライブラリ上の星の数、logrus機能、パフォーマンス、効率的、かつ、柔軟性の高いです。

このようドッキングウィンドウ、プロメテウス、dejavuzhou / ginbro、などの多くのオープンソースプロジェクトは、そのログを記録するためにlogrusを使用しています。

logrusプロパティ

  • 6つのログレベルで利用可能logrus:APIの標準ライブラリのロギングモジュールgolangスーパーセットであり、デバッグ、情報、警告、エラー、致命的とパニック、標準ライブラリモジュールのログと完全に互換性Golang。
  • logrus.Debug(「便利なデバッグ情報。」)
  • logrus.Info(「何かの注目すべきは起こりました!」)
  • logrus.Warn(「おそらく、このを見てみるべきでしょう。」)
  • logrus.Error(「何かが失敗したが、私は辞めませんよ。」)
  • logrus.Fatal( "さようなら。")//は、(1)ログイン後os.Exitを呼び出します
  • logrus.Panic(「私はバケツよ。」)//は、(ログイン後)パニックになります
  • 拡張可能なメカニズムをフック:任意の場所に配布ログフックを介してユーザができるように、そのようなローカルファイルシステム、標準出力、logstash、elasticsearch MQなど、またはフックおよびログフォーマット定義の内容です。
  • オプションのログ出力フォーマット:logrusは、2つの形式のニーズを満たしていない場合は、あなた自身が独自のログフォーマットを定義するためのインタフェースフォーマッタインターフェイスを実装することができ、2つのログフォーマット、JSONFormatterとのTextFormatterを構築しました。
  • フィールドのメカニズム:logrusは、フィールドのログメカニズムによってではなく、退屈なログメッセージで構成、細かいことをお勧めします。
  • logrusは取り外し可能な構造化ロギングフレームワークです。
  • エントリ:logrus.WithFieldsは自動的に*エントリを返しますが、いくつかの変数内のエントリが自動的に追加されます
  • 時間:エントリが作成されたときのタイムスタンプ
  • MSG:.INFO()メソッドを呼び出すときに追加されます
  • レベル、現在のログレベル

logrus基本的な使い方

package main

import (
    "os"

    "github.com/sirupsen/logrus"
    log "github.com/sirupsen/logrus"
)

var logger *logrus.Entry

func init() {
    // 设置日志格式为json格式
    log.SetFormatter(&log.JSONFormatter{})
    log.SetOutput(os.Stdout)
    log.SetLevel(log.InfoLevel)
    logger = log.WithFields(log.Fields{"request_id": "123444", "user_ip": "127.0.0.1"})
}

func main() {
    logger.Info("hello, logrus....")
    logger.Info("hello, logrus1....")
    // log.WithFields(log.Fields{
    //  "animal": "walrus",
    //  "size":   10,
    // }).Info("A group of walrus emerges from the ocean")

    // log.WithFields(log.Fields{
    //  "omg":    true,
    //  "number": 122,
    // }).Warn("The group's number increased tremendously!")

    // log.WithFields(log.Fields{
    //  "omg":    true,
    //  "number": 100,
    // }).Fatal("The ice breaks!")
}

ログをカット基づきlogrusとファイルのrotatelogsパッケージの実装

多くの場合、アプリケーションは、シェレメチェボ自動回転切断ログ管理のためのアプリケーション用のファイルシステムにログ出力をするアプリケーションが正常にログ管理を処理しない場合は、それが不要なメンテナンスコストの多くをもたらすでしょう、非常に重要な問題です。外部ツールの切断ログ、手動クリーニングのログとディスクが再生されないことを保証するために他の手段。

ファイルのrotatelogs:あなたはセットアップlogrotateのに忘れてしまったので、これ以上のディスクフル警告:あなたはアプリあなたにこれを統合すると、自動的にアプリの中から回転させて、ログへの書き込み!

logrus自体はログローテーションカット機能をサポートしていないとに沿ってファイルのrotatelogsのパッケージログディスクを防ぐために果たし、達成します。ファイルのrotatelogsは io.Writerインタフェースを達成し、切断機能ファイルを提供するものであるシームレスな統合、両方として出力logrusを標的とし得るの例ファイルのrotatelogsをするように設計されています。

通常、このライブラリは、このような組み込みのログライブラリー、またはそのようなgithub.com/lestrrat-go/apache-logformatなどロガーとして、いくつかの他のロギングサービスで使用されることが期待されます。

サンプルコード:
1分間隔新しいロータリーファイルで、ログファイル/Users/opensource/test/go.logを適用し、3分、追加の自動クリーンアウトのための最新のログファイルを保持します。

package main

import (
	"time"

	rotatelogs "github.com/lestrrat-go/file-rotatelogs"
	log "github.com/sirupsen/logrus"
)

func init() {
	path := "/Users/opensource/test/go.log"
	/* 日志轮转相关函数
	`WithLinkName` 为最新的日志建立软连接
	`WithRotationTime` 设置日志分割的时间,隔多久分割一次
	WithMaxAge 和 WithRotationCount二者只能设置一个
	  `WithMaxAge` 设置文件清理前的最长保存时间
	  `WithRotationCount` 设置文件清理前最多保存的个数
	*/
	// 下面配置日志每隔 1 分钟轮转一个新文件,保留最近 3 分钟的日志文件,多余的自动清理掉。
	writer, _ := rotatelogs.New(
		path+".%Y%m%d%H%M",
		rotatelogs.WithLinkName(path),
		rotatelogs.WithMaxAge(time.Duration(180)*time.Second),
		rotatelogs.WithRotationTime(time.Duration(60)*time.Second),
	)
	log.SetOutput(writer)
	//log.SetFormatter(&log.JSONFormatter{})
}

func main() {
	for {
		log.Info("hello, world!")
		time.Sleep(time.Duration(2) * time.Second)
	}
}

Golang標準のログデータベースのログの使用

以下Golang標準のログライブラリ関数は、しかし、次のコード例の理解の下で、選択的であるかもしれないが、基本的な、シンプルを使用しています。

package main

import (
    "fmt"
    "log"
)

func init() {
    log.SetPrefix("【UserCenter】")                           // 设置每行日志的前缀
    log.SetFlags(log.LstdFlags | log.Lshortfile | log.LUTC) // 设置日志的抬头字段
}

func main() {
    log.Println("log...")
    log.Fatalln("Fatal Error...")
    fmt.Println("Not print!")
}

カスタムログ出力

package main

import (
    "io"
    "log"
    "os"
)

var (
    Info    *log.Logger
    Warning *log.Logger
    Error   *log.Logger
)

func init() {
    errFile, err := os.OpenFile("errors.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)
    if err != nil {
        log.Fatalln("打开日志文件失败:", err)
    }

    Info = log.New(os.Stdout, "Info:", log.Ldate|log.Ltime|log.Lshortfile)
    Warning = log.New(os.Stdout, "Warning:", log.Ldate|log.Ltime|log.Lshortfile)
    Error = log.New(io.MultiWriter(os.Stderr, errFile), "Error:", log.Ldate|log.Ltime|log.Lshortfile)
}

func main() {
    Info.Println("Info log...")
    Warning.Printf("Warning log...")
    Error.Println("Error log...")
}

関連ドキュメント

https://mojotv.cn/2018/12/27/golang-logrus-tutorial
https://github.com/lestrrat-go/file-rotatelogs
https://www.flysnow.org/2017/05/06/行く・イン・アクション・ゴー・log.html

发布了152 篇原创文章 · 获赞 118 · 访问量 39万+

おすすめ

転載: blog.csdn.net/qianghaohao/article/details/104103717