logrus golangフレームワークのロギングの詳細

言葉の前で

輸入パリティ以下のいくつかのサンプルコードは、私は私はちょうど私のテストコードの1から撤退、やらなかった、彼自身の簡単なエラー処理の下のいくつかを使用することができます。

logrusプロフィール

logrusは取り外し可能な構造化されたロギングフレームワークです。
6つのログレベルで利用可能logrus:デバッグ、情報、警告、エラー 、致命的なパニック
拡張可能なメカニズムのフックは:
そのようなローカルファイルシステム、標準出力、logstash、elasticsearchかのように、任意の場所を配布し、ユーザーがログを通じて道をフックすることができますMQのような、またはフックログの内容と形式で定義されました。
logrusは、2つの形式のニーズを満たしていない場合、あなたは独自のログフォーマットを定義するには、インターフェイス自分フォーマッタを実装することができ、2つのログフォーマット、JSONFormatterとのTextFormatterを構築しました。
奨励logrusは罰金、フィールドのログメカニズムによってではなく、退屈なログメッセージで構成される。

簡単な例を書きます

package main

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

func main() {
  log.WithFields(log.Fields{
    "animal": "walrus",
  }).Info("A walrus appears")
}

高度な使い方

大規模プロジェクトは、多くの場合、すべてのプロジェクトを記録するために、そのロガーオブジェクトをグローバルlogrusインスタンスを必要とするため、ロガーは、使用の比較的高いレベルです。

いくつかのデフォルトの初期化

package main

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

func main() {
	var log = logrus.New()
	// 设置日志级别为xx以及以上
	 log.SetLevel(logrus.InfoLevel)
	 //JSON在生产中通常只在使用Splunk或Logstash等工具进行日志聚合时才有用。
	 // 设置日志格式为json格式
	// log.SetFormatter(&logrus.JSONFormatter{
	// 	// PrettyPrint: true,//格式化json
	// 	TimestampFormat: "2006-01-02 15:04:05",//时间格式化
	// })
	log.SetFormatter(&logrus.TextFormatter{
		TimestampFormat: "2006-01-02 15:04:05",//时间格式化
	})
	// 设置将日志输出到标准输出(默认的输出为stderr,标准错误)
	// 日志消息输出可以是任意的io.writer类型
	log.SetOutput(os.Stdout)
    // 初始化一些公共参数
	loginit:=log.WithFields(logrus.Fields{
		"animal": "walrus",
	})
	//输出日志
	log.Info("A walrus appears")
}

印刷ファイルの行番号とログ内のその他の情報

log.SetReportCaller(真)は、行番号を印刷することができます

package main

import (
  "github.com/sirupsen/logrus"
  "os"
  "runtime"
	"time"
)

func main() {
// logger是一种相对高级的用法, 对于一个大型项目, 往往需要一个全局的logrus实例,即logger对象来记录项目所有的日志。
	var log = logrus.New()
	log.SetReportCaller(true) // 显示行号等信息
	 // 设置日志级别为xx以及以上
	 log.SetLevel(logrus.InfoLevel)
	log.SetFormatter(&logrus.TextFormatter{
		TimestampFormat: "2006-01-02 15:04:05",//时间格式化
	})
	// 设置将日志输出到标准输出(默认的输出为stderr,标准错误)
	// 日志消息输出可以是任意的io.writer类型
	log.SetOutput(os.Stdout)
	// 初始化一些公共参数
	loginit:=log.WithFields(logrus.Fields{
		"animal": "walrus",
	})
	log.Info("A walrus appears")
}

フックを使用してください

AddHook()メソッドを使用して

package main

import (
  "github.com/sirupsen/logrus"
  "os"
  "runtime"
	"time"
)

func main() {
// logger是一种相对高级的用法, 对于一个大型项目, 往往需要一个全局的logrus实例,即logger对象来记录项目所有的日志。
	var log = logrus.New()
	log.SetReportCaller(true)
	 // 设置日志级别为xx以及以上
	 log.SetLevel(logrus.InfoLevel)
	log.AddHook(&DefaultFieldHook{})

	log.SetFormatter(&logrus.TextFormatter{
		TimestampFormat: "2006-01-02 15:04:05",//时间格式化

	})
	// 设置将日志输出到标准输出(默认的输出为stderr,标准错误)
	// 日志消息输出可以是任意的io.writer类型
	log.SetOutput(os.Stdout)

	// 初始化一些公共参数
	loginit:=log.WithFields(logrus.Fields{
		"animal": "walrus",
	})

	log.Info("A walrus appears")
	
	}
}
type DefaultFieldHook struct {
}

func (hook *DefaultFieldHook) Fire(entry *logrus.Entry) error {
	entry.Data["appName"] = "appName"
    return nil
}

func (hook *DefaultFieldHook) Levels() []logrus.Level {
    return logrus.AllLevels
}

スプリットをログに記録

Logrusがこの機能を提供していない、それは、ログ・ファイル・rotatelogsのローカルファイルの分割を必要とします。

いくつかの注意

WithLinkName()現在のログファイルとして便利な検索し、最新のログへの柔軟な接続を確立するために
)設定ファイルの分割(間WithRotationTime間隔。デフォルトでは、すなわち1日分割ログごとに86,400秒。
WithMaxAgeとWithRotationCountの両方が唯一、1を設定することができ
、ログがクリアされる前に、直近の期間に指定されているだけのログを残して、ファイルのクリーンアップを設定する前に、時間を節約するためにWithMaxAge()。クリアデフォルトのログは7日ごとにファイルの下で、あなたはrotatelogs.WithMaxAge(-1)マニュアルは禁止に設定する必要があり
、最新のn個のファイルに加えて、ログをクリアするWithRotationCount()はデフォルトで無効になっています。

あなたはログをクリアしない場合ではないすべての設定が、WithMaxAgeは-1にパラメータを設定する必要があるため、WithRotationCountはデフォルトで無効になっています。ログをクリアしないように。

:分割ルールログイン
logNameは+ "%Yの%mの%:最初のパラメータは、ログ名のルールであるrotatelogs.Newを()のD%のHの%のM%S."、 ;今年の精度、月、日、時間がある
WithRotationTimeのデフォルトの日ログファイルごとに3秒を分割するために、例えば、テストしたい場合は、ログファイルを分割:rotatelogs.WithRotationTime(time.Second * 3)、あなたは簡単に素早くコードが正しいかをテストできるように

あなたが書いてはいけないので、私は、安全フックや他の並行をテストするために、同時にログイン1万コルーチンを得た次のコード。

package main

import (
  "github.com/sirupsen/logrus"
  "os"
  "runtime"
	//   "fmt"
	//   "strings"
	"github.com/lestrrat-go/file-rotatelogs"
	"github.com/rifflock/lfshook"
	"time"
)

func main() {
// logger是一种相对高级的用法, 对于一个大型项目, 往往需要一个全局的logrus实例,即logger对象来记录项目所有的日志。
	var log = logrus.New()
	log.SetReportCaller(true)
	 // 设置日志级别为xx以及以上
	 log.SetLevel(logrus.InfoLevel)
	 log.AddHook(&DefaultFieldHook{})
	// 设置日志格式为json格式
	// log.SetFormatter(&logrus.JSONFormatter{
	// 	// PrettyPrint: true,//格式化json
	// 	TimestampFormat: "2006-01-02 15:04:05",//时间格式化
	// })
	log.SetFormatter(&logrus.TextFormatter{
		ForceColors:true,
		EnvironmentOverrideColors:true,
		// FullTimestamp:true,
		TimestampFormat: "2006-01-02 15:04:05",//时间格式化
		// DisableLevelTruncation:true,
	})
	// 设置将日志输出到标准输出(默认的输出为stderr,标准错误)
	// 日志消息输出可以是任意的io.writer类型
	log.SetOutput(os.Stdout)
	//这是我在window上的测试代码,文件名自己修改
	logName:=`G:\gopath\src\github.com\gonote\27tools\日志\aaa`
	writer, err := rotatelogs.New(
	 	//这是分割代码的命名规则,要和下面WithRotationTime时间精度一致。要是分钟都是分钟
        logName+".%Y%m%d%H%M%S",
        // WithLinkName为最新的日志建立软连接,以方便随着找到当前日志文件。windows报错没权限
        // rotatelogs.WithLinkName(logName),

       //文件切割之间的间隔。默认情况下,日志每86400秒/一天旋转一次。注意:记住要利用时间。持续时间值。
        // rotatelogs.WithRotationTime(time.Second*3),
        // WithMaxAge和WithRotationCount二者只能设置一个,
        // WithMaxAge设置文件清理前的最长保存时间,
        // WithRotationCount设置文件清理前最多保存的个数。 默认情况下,此选项是禁用的。
		// rotatelogs.WithMaxAge(time.Second*30),//默认每7天清除下日志文件
		rotatelogs.WithMaxAge(-1), //需要手动禁用禁用  默认情况下不清除日志,
        rotatelogs.WithRotationCount(2),//清除除最新2个文件之外的日志,默认禁用
    )
    if err != nil {
        log.Errorf("config local file system for logger error: %v", err)
    }

    lfsHook := lfshook.NewHook(lfshook.WriterMap{
        logrus.DebugLevel: writer,
        logrus.InfoLevel:  writer,
        logrus.WarnLevel:  writer,
        logrus.ErrorLevel: writer,
        logrus.FatalLevel: writer,
        logrus.PanicLevel: writer,
    }, &logrus.TextFormatter{DisableColors: true})

	log.AddHook(lfsHook)



	// 初始化一些公共参数
	loginit:=log.WithFields(logrus.Fields{
		"animal": "walrus",
	})

	for i:=0;i<10000;i++{
		go func(log *logrus.Entry){
			for {
				time.Sleep(time.Second*1)
				log.Info("A walrus appears")
			}
		}(loginit)
	
	}

	select{}
}

スレッドセーフ

スレッドセーフ
デフォルトでは、logrus APIは、同時書き込みを保護するために、その内部ミューテックスを通じて、スレッドセーフです。フックログを呼び出すか、書き込むためのミューテックスの仕事。あなたがロックしていない場合、あなたはそれを閉じるためにlogger.SetNoLock()を呼び出すことができます。あなたはオフにすることができlogrusミューテックスのシナリオは、次のとおりです。

フックを設定、またはフックのすべてがスレッドセーフな実装されているわけではありません。
すでにスレッドセーフlogger.Outにログを書き込みます。例えば、logger.Outロックが保護された、またはファイルを書き込み、ファイルはO_APPENDが開かれ、それぞれが4K未満の動作を記述してきました。

致命的な処理

そして、ロギングフレームワークの多くは、logrus機能実行os.Exit(1)の致命的なシリーズ。しかし、logrus Logrus(1)os.Exitを行う前に処理を対応するように、インタフェースlogrus.RegisterExitHandler(ハンドラFUNC(){})「は、一つ以上の致命的なハンドラ関数を登録することができる」を提供します。アプリケーションが適切に閉じられているので、致命的なハンドラは、システム異常のリリースにいくつかのリソースAPIを呼び出すことができます。

追伸

Baiduのを見て、ログの過半数の基本的なニーズを満たす他の機能の数、基本的な文書やgithubのにするlogrusが出てくることができるようになります

おすすめ

転載: blog.csdn.net/Edu_enth/article/details/89641939