ホームページ  >  記事  >  バックエンド開発  >  簡単な golang Logrus の使い方チュートリアル

簡単な golang Logrus の使い方チュートリアル

藏色散人
藏色散人転載
2021-05-25 14:40:203406ブラウズ

以下は、golang チュートリアル コラムからの簡単な golang Logrus 使用法チュートリアルです。困っている友人に役立つことを願っています。

golang Logrus の使いやすいチュートリアル

Logrus を使用する最も簡単な方法:

package main
import (
  log "github.com/sirupsen/logrus"
)
func main() {
  log.WithFields(log.Fields{
    "animal": "walrus",
  }).Info("A walrus appears")
}

stdlib ロガーと完全に API 互換性があることに注意してください。したがって、ログ内のどこにでもインポートを置き換えることができます。 log "github.com/sirupsen/logrus" 。すべてをカスタマイズすることもできます。

package main
import (
  "os"
  log "github.com/sirupsen/logrus"
)
func init() {
  // Log 为JSON而不是默认的ASCII格式。
  log.SetFormatter(&log.JSONFormatter{})
  // 输出到标准输出,而不是默认的标准错误
  //可以是任何io.Writer,请参阅下面的文件例如日志。
  log.SetOutput(os.Stdout)
  // 仅记录严重警告以上。
  log.SetLevel(log.WarnLevel)
}
func main() {
  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!")
  // 一种常见的模式是通过重用
  //从WithFields返回的logrus.Entry 来重用日志记录语句之间的字段
  contextLogger := log.WithFields(log.Fields{
    "common": "this is a common field",
    "other": "I also should be logged always",
  })
  contextLogger.Info("I'll be logged with common and other field")
  contextLogger.Info("Me too")
}

さらに高度な使用法として、大規模なプロジェクトの場合、プロジェクトのすべてのログを記録するために、グローバル logrus インスタンス、つまりロガー オブジェクトが必要になることがよくあります。例:

package main
import (
  "os"
  "github.com/sirupsen/logrus"
)
// 创建记录器的一个新实例。您可以有任意多个实例
var log = logrus.New()
func main() {
  // 用于设置属性的API与程序包级别
  // 导出的记录器有些不同。见Godoc。
  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": "walrus",
    "size":   10,
  }).Info("A group of walrus emerges from the ocean")
}

Fields:

Logrus は、長くて解析不可能なエラー メッセージではなく、ロギング フィールドを介して慎重に構造化されたロギングを奨励します。たとえば、log.Fatalf("Failed to send events %s to topic %s with key %d") の代わりに、次のように使用する必要があります:

log.WithFields(log.Fields{
  "event": event,
  "topic": topic,
  "key": key,
}).Fatal("Failed to send event")

この API を使用すると、生成について考える必要があることがわかりました。より便利なログ メッセージ形式のログ レコード。既存のログ ステートメントにフィールドを追加するだけで時間を節約できる状況に、私たちは数え切れないほど遭遇しました。 WithFields 呼び出しはオプションです。

一般に、Logrus で printf ファミリー関数のいずれかを使用することはヒントとみなされ、フィールドを追加する必要があります。ただし、Logrus では printf ファミリー関数を引き続き使用できます。

デフォルト フィールド

アプリケーションまたはアプリケーションの一部のログ ステートメントに常にフィールドを添付すると便利なことがよくあります。たとえば、リクエストのコンテキストで request_id と user_ip を常にログに記録したい場合があります。各行に log.WithFields(log.Fields{"request_id": request_id, "user_ip": user_ip}) を記述する代わりに、次のように渡す 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")

Hooks

ロギングレベルのフックを追加できます。たとえば、エラー、致命的、およびパニック情報に関する例外追跡サービスにエラーを送信したり、StatsD に送信したり、syslog などの複数の場所に同時にログを記録したりできます。

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/log」、「/var/run/syslog」、または「/var /run/」など) への接続もサポートします。ログ")。詳細については、syslog フックの README を確認してください。

現在既知のサービス フックのリストは、この Wiki ページにあります。

ログ レベル

Logrus には、トレース、デバッグ、情報、警告、エラー、重大、緊急の 7 つのログ レベルがあります。

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.")
// Calls os.Exit(1) after logging
log.Fatal("Bye.")
// Calls panic() after logging
log.Panic("I'm bailing.")

Logger でログ レベルを設定すると、その重大度以上のエントリのみがログに記録されます:

// Will log anything that is info or above (warn, error, fatal, panic). Default.
log.SetLevel(log.InfoLevel)

log.Level = logrus.DebugLevel (適用されている場合) プログラムにデバッグがある場合、または冗長環境なので、そこに設定すると便利な場合があります。

ENTRIES

追加されたフィールド WithField または WithFields に加えて、特定のフィールド (

time) がすべてのログ イベントに自動的に追加されます。エントリが作成されたときのタイムスタンプ。

メッセージ。 {Info、Warn、Error、Fatal、Panic} を呼び出した後に AddFields に渡されるログ メッセージ。たとえば、event.

level の送信に失敗しました。ロギングレベル。たとえば情報。

環境

ログラスには環境という概念がありません。

特定の環境でのみフックとフォーマッタを使用したい場合は、自分で処理する必要があります。たとえば、アプリケーションに環境の文字列表現であるグローバル変数Environmentがある場合、次のことができます:

import (
  log "github.com/sirupsen/logrus"
)
init() {
  // do something here to set environment depending on an environment variable
  // or command-line flag
  if Environment == "production" {
    log.SetFormatter(&log.JSONFormatter{})
  } else {
    // The TextFormatter is default, you don't actually have to do this.
    log.SetFormatter(&log.TextFormatter{})
  }
}

この設定はlogrusによって期待どおりに使用されますが、本番環境のJSONのみです。ログ集約に Splunk や Logstash などのツールを使用する場合にのみ役立ちます。

Formatter

組み込みのログ フォーマッタは、

logrus.TextFormatter です。 stdout が tty の場合、イベントはカラーで記録され、それ以外の場合、イベントはカラーで記録されます。

注: TTY がない場合にカラー出力を強制するには、ForceColors フィールドを true に設定します。 TTY を使用しても出力を強制的にカラーにしないようにするには、DisableColors フィールドを true に設定します。 Windows の場合は、github.com/mattn/go-colorable を参照してください。

色が有効になっている場合、レベルはデフォルトで 4 文字に切り詰められます。切り捨てを無効にするには、DisableLevelTruncation フィールドを true に設定します。

TTY に出力する場合、すべてのレベルが同じ幅である列を視覚的にスキャンすると役立つことがよくあります。この動作を有効にするには、レベル テキストにパディングを追加し、PadLevelText フィールドを true に設定します。

すべてのオプションは、生成されたドキュメントにリストされています。

logrus.JSONFormatter。フィールドを JSON としてログに記録します。

すべてのオプションは、生成されたドキュメントにリストされています。

サードパーティのログ フォーマッタ:

FluentdFormatter。 Kubernetes と Google Container Engine で解析できる形式のエントリ。

ゲルフ。 Graylog の GELF 1.1 仕様に準拠するようにエントリをフォーマットします。

ログスタッシュ。フィールドを Logstash イベントとしてログに記録します。

という接頭辞が付きます。ログ エントリ ソースと代替レイアウトを表示します。

ザルゴ。ザルゴの力を呼び出せ。

ネストされたログラスフォーマッタ。対数フィールドを入れ子構造に変換します。

powerful-logrus-formatter。打印日志时获取文件名,日志行号和最新函数名称;Sava日志到文件。

caption-json-formatter。添加了人类可读标题的logrus消息json格式化程序。

您可以通过实现Formatter接口(需要一种Format方法)来定义格式化程序。Format需要一个*Entry。entry.Data是一种 Fields类型(map[string]interface{}),其中包含您的所有字段以及默认字段(请参见上面的条目部分):

type MyJSONFormatter struct {
}
log.SetFormatter(new(MyJSONFormatter))
func (f *MyJSONFormatter) Format(entry *Entry) ([]byte, error) {
  // Note this doesn't include Time, Level and Message which are available on
  // the Entry. Consult `godoc` on information about those fields or read the
  // source of the official loggers.
  serialized, err := json.Marshal(entry.Data)
    if err != nil {
      return nil, fmt.Errorf("Failed to marshal fields to JSON, %v", err)
    }
  return append(serialized, '\n'), nil
}

记录为 io.Writer

Logrus可以转换为io.Writer。该作家是an的结尾,io.Pipe您有责任关闭它。

w := logger.Writer()
defer w.Close()
srv := http.Server{
    // create a stdlib log.Logger that writes to
    // logrus.Logger.
    ErrorLog: log.New(w, "", 0),
}

写入该写入器的每一行都将使用格式化程序和钩子以常规方式打印。这些条目的级别为info。

这意味着我们可以轻松覆盖标准库记录器:

logger := logrus.New()
logger.Formatter = &logrus.JSONFormatter{}
// Use logrus for standard log output
// Note that `log` here references stdlib's log
// Not logrus imported under the name `log`.
log.SetOutput(logger.Writer())

日志轮换

Logrus不提供日志轮换。日志轮换应由logrotate(8)可以压缩和删除旧日志条目的外部程序(如)完成。它不应该是应用程序级记录器的功能。

以上が簡単な golang Logrus の使い方チュートリアルの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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