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

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

May 25, 2021 pm 02:40 PM
golang

以下は、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 サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Golang を使用してファイルを安全に読み書きするにはどうすればよいですか? Golang を使用してファイルを安全に読み書きするにはどうすればよいですか? Jun 06, 2024 pm 05:14 PM

Go ではファイルを安全に読み書きすることが重要です。ガイドラインには以下が含まれます。 ファイル権限の確認 遅延を使用してファイルを閉じる ファイル パスの検証 コンテキスト タイムアウトの使用 これらのガイドラインに従うことで、データのセキュリティとアプリケーションの堅牢性が確保されます。

Golang データベース接続用の接続プールを構成するにはどうすればよいですか? Golang データベース接続用の接続プールを構成するにはどうすればよいですか? Jun 06, 2024 am 11:21 AM

Go データベース接続の接続プーリングを構成するにはどうすればよいですか?データベース接続を作成するには、database/sql パッケージの DB タイプを使用します。同時接続の最大数を制御するには、MaxOpenConns を設定します。アイドル状態の接続の最大数を設定するには、ConnMaxLifetime を設定します。

Golang と C++ の類似点と相違点 Golang と C++ の類似点と相違点 Jun 05, 2024 pm 06:12 PM

Golang と C++ は、それぞれガベージ コレクションと手動メモリ管理のプログラミング言語であり、構文と型システムが異なります。 Golang は Goroutine を通じて同時プログラミングを実装し、C++ はスレッドを通じて同時プログラミングを実装します。 Golang のメモリ管理はシンプルで、C++ の方がパフォーマンスが優れています。実際の場合、Golang コードはより簡潔であり、C++ には明らかにパフォーマンス上の利点があります。

Golang フレームワーク アーキテクチャの学習曲線はどれくらい急ですか? Golang フレームワーク アーキテクチャの学習曲線はどれくらい急ですか? Jun 05, 2024 pm 06:59 PM

Go フレームワーク アーキテクチャの学習曲線は、Go 言語とバックエンド開発への慣れ、選択したフレームワークの複雑さ、つまり Go 言語の基本の十分な理解によって決まります。バックエンドの開発経験があると役立ちます。フレームワークの複雑さが異なると、学習曲線も異なります。

Golangでリストからランダムな要素を生成するにはどうすればよいですか? Golangでリストからランダムな要素を生成するにはどうすればよいですか? Jun 05, 2024 pm 04:28 PM

Golang でリストのランダムな要素を生成する方法: rand.Intn(len(list)) を使用して、リストの長さの範囲内でランダムな整数を生成し、その整数をインデックスとして使用して、リストから対応する要素を取得します。

golangフレームワークの長所と短所の比較 golangフレームワークの長所と短所の比較 Jun 05, 2024 pm 09:32 PM

Go フレームワークは、その高いパフォーマンスと同時実行性の利点で際立っていますが、比較的新しい、開発者エコシステムが小さい、一部の機能が欠けているなどの欠点もあります。さらに、急速な変化と学習曲線はフレームワークごとに異なる場合があります。 Gin フレームワークは、効率的なルーティング、組み込みの JSON サポート、強力なエラー処理機能により、RESTful API を構築するための一般的な選択肢です。

Golang フレームワークでのエラー処理のベスト プラクティスは何ですか? Golang フレームワークでのエラー処理のベスト プラクティスは何ですか? Jun 05, 2024 pm 10:39 PM

ベスト プラクティス: 明確に定義されたエラー タイプ (エラー パッケージ) を使用してカスタム エラーを作成する 詳細を提供する エラーを適切にログに記録する エラーを正しく伝播し、非表示または抑制しないようにする コンテキストを追加するために必要に応じてエラーをラップする

golang フレームワーク ドキュメントの使用手順 golang フレームワーク ドキュメントの使用手順 Jun 05, 2024 pm 06:04 PM

Go フレームワークのドキュメントを使用するにはどうすればよいですか?ドキュメントの種類を決定します: 公式 Web サイト、GitHub リポジトリ、サードパーティのリソース。ドキュメントの構造 (入門書、詳細なチュートリアル、リファレンス マニュアル) を理解します。必要に応じて情報を見つけます。組織構造または検索機能を使用します。用語と概念を理解する: 新しい用語と概念を注意深く読んで理解します。実際のケース: Beego を使用して単純な Web サーバーを作成します。その他の Go フレームワークのドキュメント: Jin、Echo、Buffalo、Fiber。

See all articles