THE NEW Go 1.21 のパッケージは、構造化されたログを標準のライブラリに導入します。構造化されたログはキー値のペアを使用して、迅速かつ信頼性の高い方法で解析、フィルタリング、検索、分析することができます。サーバーにとって、ログは、開発者がシステムの詳細な行動を観察する重要な方法であり、しばしば最初の場所は、それをデバッグするためです。 log/slog 標準図書館にはログアップパッケージがあり、 , Goの最初のリリースから10年以上前です。 時間の経過とともに、我々は、構造化されたログインがGoプログラマにとって重要であることを学びました。 それは、我々の年間調査で一貫して高くランクされ、Goのエコシステムの多くのパッケージがそれを提供しています。 100,000以上の他のパッケージで使用されています。 log 成功者 多くの構造化されたログ出力パッケージから選択する場合、大規模なプログラムはしばしばその依存性を介して複数のプログラムを含むようになります。 主なプログラムは、これらのログ出力が一貫しているように各ログパッケージを構成する必要があります:すべては同じ場所、同じ形式に移動します。 A TOUR OF ストレッチ ストレッチ 最も使いやすいプログラムはこちら。 : slog package main import "log/slog" func main() { slog.Info("hello, world") } この記事を書くと、印刷: 2023/08/04 16:09:19 INFO hello, world THE 関数は、デフォルトログガイドを使用して、Infoログレベルでメッセージを印刷しますが、この場合、デフォルトログガイドは、 package — the same logger you get when you write. あなたが書くときに得る同じロガー それは、なぜ出力がこんなに似ているのかを説明します: 「INFO」だけが新しいです。 そして、オリジナル パッケージは一緒に作業し、始めるのが簡単になります。 Info log log.Printf slog log ほか , 他の3つのレベルに機能があります- で、 そして、 また、より一般的な レベルを論点として取る機能です。 , レベルは単に整数なので、あなたは4つの名前のレベルに限定されません。 ゼロと、 あなたのログシステムがそれらの間のレベルを持っている場合は、そのために2を使用することができます。 Info Debug Warn Error Log slog Info Warn とは異なり、The パッケージ、私たちは簡単にメッセージの後にそれらを書くことで、私たちの出力にキー値のカップルを追加することができます: log slog.Info("hello, world", "user", os.Getenv("USER")) 現在の出力はこんな感じです。 2023/08/04 16:27:19 INFO hello, world user=jba 前述したように、 トップレベルの関数は、デフォルトロガーを使用します. We can get this logger explicitly, and call its methods: slog logger := slog.Default() logger.Info("hello, world", "user", os.Getenv("USER")) 各トップレベルの関数は、a 出力は以前と同じです。 slog.Logger 最初に、slog の出力はデフォルトを通過します。 上から見た結果を生成します. 出力を変えることによって出力を変えることができます。 ロガーによって使われている。 内蔵の2つのハンドルが付いています(A) emits all log information in the form. すべてのログ情報を形式に送信します。 このプログラムは、Aを使用して新しいログを作成します。 そして、同じ呼びかけを、 方法: log.Logger トレーニング slog TextHandler key=value TextHandler Info logger := slog.New(slog.NewTextHandler(os.Stdout, nil)) logger.Info("hello, world", "user", os.Getenv("USER")) 現在の出力はこんな感じです。 time=2023-08-04T16:56:03.786-04:00 level=INFO msg="hello, world" user=jba すべてがキー値のカップルに変換され、構造を維持するために必要に応じて文字列を引用しています。 JSON 出力の場合、Install the built-in 代わりに: JSONHandler logger := slog.New(slog.NewJSONHandler(os.Stdout, nil)) logger.Info("hello, world", "user", os.Getenv("USER")) 現在、私たちの出力は JSON オブジェクトの順序であり、ログ コールごとに 1 つです。 {"time":"2023-08-04T16:58:02.939245411-04:00","level":"INFO","msg":"hello, world","user":"jba"} You are not limited to the built-in handlers. Anyone can write a handler by implementing the インタフェース. A handler can generate output in a particular format, or it can wrap another handler to add functionality. 特定の形式で出力を生成するか、あるいは機能を追加するために別の handlerを巻き込むことができます。 IN THE ドキュメントでは、ログメッセージが表示される最小レベルを変更する包装マネージャを書く方法を示しています。 slog.Handler 例 slog 我々がこれまで使用してきた属性のための交代キー値のシンタクスは便利ですが、頻繁に実行されるログ定義では、使用するのがより効率的かもしれません。 type and call the メモリ分配を最小限に抑えるために、これらの機能は共に動作します。 文字列、数字、およびその他の一般的なタイプから s を除きます。 Attr LogAttrs Attr この呼びかけは 上記と同じ出力を生成しますが、より速く行います。 LogAttrs slog.LogAttrs(context.Background(), slog.LevelInfo, "hello, world", slog.String("user", os.Getenv("USER"))) There is a lot more to : slog LogAttrs への呼び出しが示すように、context.Context をいくつかのログ 関数に転送して、トレーダーがトラック ID などのコンテキスト情報を抽出できます(コンテキストをキャンセルすることは、ログ エントリの書き込みを妨げません)。 You can call Logger.With to add attributes to a logger that will appear in all of its output, effectively factoring out the common parts of several log statements. This is not only convenient, but it can also help performance, as discussed below. ロガーを呼び出すことができます。 属性はグループに組み合わせることができます. This can add more structure to your log output and can help to disambiguate keys that would otherwise be identical. これは、ログ出力により多くの構造を追加し、異なり同一であるキーを解明するのに役立ちます。 値がログにどのように表示されるかを制御するには、そのタイプを LogValue メソッドで提供することもできます. That can be used to log the fields of a struct as a group or edit sensitive data, among other things. すべてについて学ぶのに最適な場所 is the . slog パッケージ文書 実績 欲しかった 大規模なパフォーマンスの向上のために、我々は設計 最適化の機会を提供するためのインターフェイス。 メソッドは、すべてのログイベントの開始時に呼び出され、トレーダーに望ましくないログイベントを迅速に落とすチャンスを与えます。 そして methods allow the handler to format attributes added by 毎回のログアップ呼び出しの代わりに、このプレフォーマットは、大規模な属性、例えば A に加えられています。 その後、たくさんの通話で使われています。 slog THE Handler Enabled WithAttrs WithGroup Logger.With http.Request Logger 当社のパフォーマンス最適化作業を報告するために、既存のオープンソースプロジェクトにおける記録の典型的なパターンを調査しました.We found that over 95% of calls to logging methods pass five or fewer attributes.We also categorized the types of attributes, finding that a handful of common types accounted for the majority. その後、一般的なケースをキャプチャするベンチマークを書き、時間の流れを見るためのガイドとして使用しました。 デザインプロセス THE パッケージは、Go 1が2012年にリリースされて以来、標準ライブラリへの最大の追加の一つです。 slog 2022 年 4 月までに、我々 は Go コミュニティにおける構造化されたログの重要性を示すのに十分なデータを収集しました。 私たちは、既存の構造化ログリングパッケージがどのように設計されたかを調べ始めた。私たちはまた、これらのパッケージが実際にどのように使われているかを学ぶために、Goモジュールプロキシに格納されているオープンソースのGoコードの大規模なコレクションを利用しました。私たちの最初のデザインは、この研究とGoのシンプルさの精神によって知られました。 既存のサードパーティのログアップパッケージを置き換えることは決して目標ではありませんでした。それらはすべて彼らが行うことに優秀で、うまく機能する既存のコードを置き換えることは、開発者の時間の良い使い方ではありませんでした。 バックエンドインターフェイスと呼ばれ、 したがって、既存のログアップパッケージは共通のバックエンドと話すことができますので、それらを使用するパッケージは再書きする必要がなく相互作用することができます。 で、 そして . Logger Handler ZAP ラグ hclog 私たちは、ゴーのチーム内で初期のデザインを共有し、広範な木造経験を有する他の開発者たちと共有しました。私たちは彼らのフィードバックに基づいて変更を行い、2022年8月までに、私たちは実行可能なデザインを持っていると感じました。 公開して始めたA コミュニティが何を言っているかを聞くために、その反応は熱心で、大半はポジティブでした。他の構造化されたログアップパッケージのデザイナーやユーザーからの洞察力のあるコメントのおかげで、いくつかの変更を行い、グループなどの機能を追加しました。 インタフェース. We changed the mapping from log levels to integers twice. 私たちはログレベルからインタフェースにマッピングを2回変更しました。 実験実施 GitHubの議論 LogValuer 2ヶ月と約300件のコメントの後、私たちは実際の行動に備えていると感じました。 同行する 提案項目は800件を超えるコメントを集め、APIと実装に多くの改善をもたらしました。 : 提案 デザイン DOC context.Context 当初、API は文脈にログガーを追加することをサポートしていました。多くの人々は、これはログガーを簡単にコードのレベルを通して導入するのに便利な方法だと感じましたが、他の人々は暗示的な依存性で密輸していると感じ、コードを理解しにくくなりました。 私たちはもともと文脈を最初の議論として伝える標準パターンに抵抗したのは、すべてのログアップ呼び出しに文脈が必要であることを望んでいなかったため、結局は文脈と文脈のいずれかを含む2セットのログアップ方法を作成しました。 One change we didn't make concern the alternating key-and-value syntax for expressing attributes. 属性を表現するためのキーと値の交替シンタクス: slog.Info("message", "k1", v1, "k2", v2) 多くの人々は、これは悪いアイデアだと強く感じました. 彼らは、キーや値を省略することによって読み取りが困難で、間違えやすいと感じました. 彼らは構造を表現するための明示的な属性を好みました: slog.Info("message", slog.Int("k1", v1), slog.String("k2", v2)) しかし、私たちは、より軽いシンタクスが、特に新しいGoプログラマーにとって、Goの使いやすさと楽しさを保つために重要だと感じました。 で、 そして (その他) ) 成功して代替キーと値を使用しました. We added a 一般的なミスを捕まえましたが、デザインを変えませんでした。 logr go-kit/log zap SugaredLogger チェックチェック 2023年3月15日、提案は承認されたが、未解決の問題がいくつか残っていた。 パッケージの完成とともに、 管理者を検証するためのパッケージと、代替キーと値の正しい使用のための獣医検査。 log/slog testing/slogtest そして8月8日、Go 1.21がリリースされ、 私たちは、あなたがそれを役に立つと見つけることを願っています、そしてそれが作るのと同じくらい楽しかったように使用します。 slog そして、議論や提案プロセスに参加してくれたすべての人に感謝します。あなたの貢献は改善されました。 不思議に slog 資源 THE for the パッケージは、それを使用する方法を説明し、いくつかの例を提供します。 文書化 log/slog THE Go コミュニティが提供する追加のリソースがあり、さまざまなマネージャーを含む。 wikiページ If you want to write a handler, consult the . 手書きガイド 手書きガイド ジョナサン・オーストラリア 写真:Jeff Smith on Unsplash ジェフ・スミス Unsplashについて この記事は、CC BY 4.0 DEED ライセンスの下で The Go Blog で利用できます。 GO BLOG GO BLOG