言葉の前で
輸入パリティ以下のいくつかのサンプルコードは、私は私はちょうど私のテストコードの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が出てくることができるようになります