Go の超高速で構造化された平準化されたロギング。
go get -u go.uber.org/zap
zap は Go の最新の 2 つのマイナー バージョンのみをサポートしていることに注意してください。
パフォーマンスは良好だが重要ではないコンテキストでは、 SugaredLogger
を使用します。他の構造化ログ パッケージよりも 4 ~ 10 倍高速で、構造化 API とprintf
スタイル API の両方が含まれています。
logger , _ := zap . NewProduction ()
defer logger . Sync () // flushes buffer, if any
sugar := logger . Sugar ()
sugar . Infow ( "failed to fetch URL" ,
// Structured context as loosely typed key-value pairs.
"url" , url ,
"attempt" , 3 ,
"backoff" , time . Second ,
)
sugar . Infof ( "Failed to fetch URL: %s" , url )
パフォーマンスと型の安全性が重要な場合は、 Logger
使用します。 SugaredLogger
よりもさらに高速で、割り当てられる量ははるかに少なくなりますが、サポートされるのは構造化されたログのみです。
logger , _ := zap . NewProduction ()
defer logger . Sync ()
logger . Info ( "failed to fetch URL" ,
// Structured context as strongly typed Field values.
zap . String ( "url" , url ),
zap . Int ( "attempt" , 3 ),
zap . Duration ( "backoff" , time . Second ),
)
詳細については、ドキュメントと FAQ を参照してください。
ホット パスにログインするアプリケーションの場合、リフレクション ベースのシリアル化と文字列の書式設定は非常に高価です。これらは CPU を大量に使用し、多くの小さな割り当てを行います。言い換えると、 encoding/json
とfmt.Fprintf
を使用して大量のinterface{}
ザップは異なるアプローチをとります。これには、リフレクションのない割り当てゼロの JSON エンコーダーが含まれており、基本Logger
可能な限りシリアル化のオーバーヘッドと割り当てを回避するよう努めます。その基盤上に高レベルのSugaredLogger
構築することで、zap はユーザーがすべての割り当てをカウントする必要がある場合と、より使い慣れた緩やかに型指定された API を好む場合を選択できるようにします。
独自のベンチマーク スイートで測定したところ、zap は同等の構造化ログ パッケージよりもパフォーマンスが高いだけでなく、標準ライブラリよりも高速です。すべてのベンチマークと同様に、これらのベンチマークも割り引いて考えてください。 1
メッセージと 10 個のフィールドをログに記録します。
パッケージ | 時間 | ザップにかかる時間 % | 割り当てられたオブジェクト |
---|---|---|---|
⚡ ザップ | 656ns/動作 | +0% | 5 割り当て/操作 |
⚡ザップ(砂糖入り) | 935ns/動作 | +43% | 10 割り当て/オペレーション |
ゼロログ | 380ns/動作 | -42% | 1 割り当て/操作 |
ゴーキット | 2249ns/動作 | +243% | 57 割り当て/オペレーション |
スログ (LogAttrs) | 2479ns/動作 | +278% | 40 割り当て/オペレーション |
スロッグ | 2481ns/動作 | +278% | 42 割り当て/オペレーション |
頂点/ログ | 9591ns/オペレーション | +1362% | 63 割り当て/オペレーション |
ログ15 | 11393ns/オペレーション | +1637% | 75 割り当て/オペレーション |
ログルス | 11654ns/オペレーション | +1677% | 79 割り当て/操作 |
すでに 10 個のコンテキストフィールドがあるロガーを使用してメッセージを記録します。
パッケージ | 時間 | ザップにかかる時間 % | 割り当てられたオブジェクト |
---|---|---|---|
⚡ ザップ | 67ns/動作 | +0% | 0 割り当て/操作 |
⚡ザップ(砂糖入り) | 84ns/動作 | +25% | 1 割り当て/操作 |
ゼロログ | 35ns/動作 | -48% | 0 割り当て/操作 |
スロッグ | 193ns/動作 | +188% | 0 割り当て/操作 |
スログ (LogAttrs) | 200ns/動作 | +199% | 0 割り当て/操作 |
ゴーキット | 2460ns/動作 | +3572% | 56 割り当て/オペレーション |
ログ15 | 9038ns/オペレーション | +13390% | 70 割り当て/オペレーション |
頂点/ログ | 9068ns/動作 | +13434% | 53 割り当て/オペレーション |
ログルス | 10521ns/オペレーション | +15603% | 68 割り当て/オペレーション |
コンテキストやprintf
スタイルのテンプレートを使用せずに、静的文字列をログに記録します。
パッケージ | 時間 | ザップにかかる時間 % | 割り当てられたオブジェクト |
---|---|---|---|
⚡ ザップ | 63ns/動作 | +0% | 0 割り当て/操作 |
⚡ザップ(砂糖入り) | 81ns/動作 | +29% | 1 割り当て/操作 |
ゼロログ | 32ns/動作 | -49% | 0 割り当て/操作 |
標準ライブラリ | 124ns/動作 | +97% | 1 割り当て/操作 |
スロッグ | 196ns/動作 | +211% | 0 割り当て/操作 |
スログ (LogAttrs) | 200ns/動作 | +217% | 0 割り当て/操作 |
ゴーキット | 213ns/動作 | +238% | 9 割り当て/操作 |
頂点/ログ | 771ns/動作 | +1124% | 5 割り当て/操作 |
ログルス | 1439ns/動作 | +2184% | 23 割り当て/オペレーション |
ログ15 | 2069ns/オペレーション | +3184% | 20 割り当て/オペレーション |
すべての API は完成しており、1.x シリーズのリリースでは重大な変更は行われません。サーバー対応の依存関係管理システムのユーザーは、ザップを^1
に固定する必要があります。
私たちは、あなたを含む貢献者の活発で健全なコミュニティを奨励し、サポートします。詳細は貢献ガイドと行動規範に記載されています。 zap のメンテナーは問題やプル リクエストを監視していますが、否定的な行為があれば [email protected] に報告することもできます。その電子メール リストはプライベートで安全なスペースです。ザップの管理者でさえアクセス権を持っていないため、躊躇せずに高い基準を維持してください。
MITライセンスに基づいてリリースされています。
1特に、他のパッケージの少し古いバージョンに対してベンチマークを行う可能性があることに留意してください。バージョンは、benchmarks/go.mod ファイルに固定されています。 ↩