内蔵のログインゴー言語ライブラリ関数は比較的簡単ですが原因でプログラムが不可欠でログインし、私たちはしばしば、実際の開発では、開発のためのサードパーティのロギングライブラリを使用することを選択しました。この記事では説明しlogrus
、ログライブラリの基本的な使用を。
logrusはじめに
Logrusはゴー(golang)構造化されたロガーは、標準のAPIライブラリロガーと完全に互換性があります。
これは、次の特性があります。
- 標準ログライブラリと完全互換のログレベルの7種類があります:
Trace
、Debug
、Info
、Warning
、Error
、Fatal
とPanic
。 - そのようなローカルファイルシステム、logstash、elasticsearch MQまたはログのような、又はフックによって定義されたフォーマットと内容などの任意の場所に分散ログフックを介してユーザを可能にする拡張可能なメカニズムを、フック
- オプションのログの出力形式、2つの組み込みログ形式とのTextFormatter JSONFormaterは、また、ログフォーマットをカスタマイズすることができます
- 提出されたロギングメカニズムによって構造化フィールドメカニズム
- スレッドセーフ
インストール
go get github.com/sirupsen/logrus
基本的な例
Logrus単純なパケットレベルのエクスポートログのプログラムを使用するための最も簡単な方法:
package main
import (
log "github.com/sirupsen/logrus"
)
func main() {
log.WithFields(log.Fields{
"animal": "dog",
}).Info("一条舔狗出现了。")
}
高度な例
そのような複数の場所に同じアプリケーションでの記録など、より高度な使い方について、あなたはまた、logrusロガーのインスタンスを作成することができます。
package main
import (
"os"
"github.com/sirupsen/logrus"
)
// 创建一个新的logger实例。可以创建任意多个。
var log = logrus.New()
func main() {
// 设置日志输出为os.Stdout
log.Out = os.Stdout
// 可以设置像文件等任意`io.Writer`类型作为日志输出
// file, err := os.OpenFile("logrus.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)
// if err == nil {
// log.Out = file
// } else {
// log.Info("Failed to log to file, using default stderr")
// }
log.WithFields(logrus.Fields{
"animal": "dog",
"size": 10,
}).Info("一群舔狗出现了。")
}
ログレベル
Logrusは7つのログレベルを持っている:Trace
、Debug
、Info
、Warning
、Error
、Fatal
とPanic
。
log.Trace("Something very low level.")
log.Debug("Useful debugging information.")
log.Info("Something noteworthy happened!")
log.Warn("You should probably take a look at this.")
log.Error("Something failed but I'm not quitting.")
// 记完日志后会调用os.Exit(1)
log.Fatal("Bye.")
// 记完日志后会调用 panic()
log.Panic("I'm bailing.")
ログレベルを設定します。
あなたはロガーのロギングのレベルを設定することができ、それが唯一のエントリレベルまたはコンテンツのいずれかのレベルより上に記録されます:
// 会记录info及以上级别 (warn, error, fatal, panic)
log.SetLevel(log.InfoLevel)
あなたのプログラムは、デバッグモードをサポートしている場合や、環境変数セットがlog.Level = logrus.DebugLevel
参考になります。
フィールド
Logrusは、エラーメッセージが解決できないというよりも長く、ログフィールドで慎重な構造化されたログを奨励します。
例えば、異なる使用はlog.Fatalf("Failed to send event %s to topic %s with key %d")
、あなたが見つけることが容易、次の録画されたコンテンツを使用する必要があります。
log.WithFields(log.Fields{
"event": event,
"topic": topic,
"key": key,
}).Fatal("Failed to send event")
WithFields
コールはオプションです。
デフォルトのフィールド
一般的に、一部のフィールドは、常に参考になるアプリケーションの全部または一部のログ書に添付されています。たとえば、あなたは常に記録されている要求のコンテキストになりたいかもしれないrequest_id
とuser_ip
。
各ライン上に書くことは、ログとは異なりlog.WithFields(log.Fields{"request_id": request_id, "user_ip": user_ip})
、次のサンプルコードにように、1つを作成することができlogrus.Entry
、これらのフィールドを渡します。
requestLogger := log.WithFields(log.Fields{"request_id": request_id, "user_ip": user_ip})
requestLogger.Info("something happened on that request") # will log request_id and user_ip
requestLogger.Warn("something not great happened")
ログエントリ
使用に加えてWithField
またはWithFields
フィールドの外には、いくつかのフィールドが自動的に問題ですべてのログに追加され、コメントを追加しました:
- 時間:タイムスタンプのロギング
- MSG:記録された情報をログに記録
- レベル:レベルの記録をログに記録
フック
あなたはフック(フック)のログレベルを追加することができます。例えば、トラッキングサービスは、異常な送信Error
、Fatal
およびPanic
情報は、syslogのような位置に、複数の同時にStatsDまたはログを送信します。
Logrusは、内蔵フックが装備されています。ではinit
これらのカスタムビルトインフックまたはフックを追加しますで:
import (
log "github.com/sirupsen/logrus"
"gopkg.in/gemnasium/logrus-airbrake-hook.v2" // the package is named "airbrake"
logrus_syslog "github.com/sirupsen/logrus/hooks/syslog"
"log/syslog"
)
func init() {
// Use the Airbrake hook to report errors that have Error severity or above to
// an exception tracker. You can create custom hooks, see the Hooks section.
log.AddHook(airbrake.NewHook(123, "xyz", "production"))
hook, err := logrus_syslog.NewSyslogHook("udp", "localhost:514", syslog.LOG_INFO, "")
if err != nil {
log.Error("Unable to connect to local syslog daemon")
} else {
log.AddHook(hook)
}
}
意味:Syslogのフックはまた、ローカルのsyslogへの接続をサポートする(例えば"は/ dev /ログ"または"は/ var /実行/ syslogの"または"は/ var /実行/ログ"を。)。詳細については、以下を参照してくださいsyslogのはREADMEをフック。
フォーマット
logrusは、2つのログフォーマッタを構築しました:
logrus.TextFormatter
logrus.JSONFormatter
また、プロジェクトのホームページを参照してください、サードパーティ製のフォーマットプログラムをサポートしています。
レコード関数名
あなたは、次のようにして、フィールドのために呼び出される関数の名前を追加したい場合:
log.SetReportCaller(true)
これは以下のように、「方法」として、発信者を追加します。
{"animal":"penguin","level":"fatal","method":"github.com/sirupsen/arcticcreatures.migrate","msg":"a penguin swims by",
"time":"2014-03-10 19:57:38.562543129 -0400 EDT"}
```
注意:,开启这个模式会增加性能开销。
线程安全
默认的logger在并发写的时候是被mutex保护的,比如当同时调用hook和写log时mutex就会被请求,有另外一种情况,文件是以appending mode打开的, 此时的并发操作就是安全的,可以用
logger.SetNoLock()
来关闭它。gin框架使用logrus
// a gin with logrus demo var log = logrus.New() func init() { // Log as JSON instead of the default ASCII formatter. log.Formatter = &logrus.JSONFormatter{} // Output to stdout instead of the default stderr // Can be any io.Writer, see below for File example f, _ := os.Create("./gin.log") log.Out = f gin.SetMode(gin.ReleaseMode) gin.DefaultWriter = log.Out // Only log the warning severity or above. log.Level = logrus.InfoLevel } func main() { // 创建一个默认的路由引擎 r := gin.Default() // GET:请求方式;/hello:请求的路径 // 当客户端以GET方法请求/hello路径时,会执行后面的匿名函数 r.GET("/hello", func(c *gin.Context) { log.WithFields(logrus.Fields{ "animal": "walrus", "size": 10, }).Warn("A group of walrus emerges from the ocean") // c.JSON:返回JSON格式的数据 c.JSON(200, gin.H{ "message": "Hello world!", }) }) // 启动HTTP服务,默认在0.0.0.0:8080启动服务 r.Run() }