「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > Go で無効になったステートメントの効率的なロギングを実現するにはどうすればよいですか?

Go で無効になったステートメントの効率的なロギングを実現するにはどうすればよいですか?

2024 年 11 月 8 日に公開
ブラウズ:751

How to Achieve Efficient Logging for Disabled Statements in Go?

Go での無効なステートメントの効率的なロギング

クリティカル パスでは、動的に切り替えることができるデバッグ/トレース ロギング ステートメントを埋め込むと有益です。ランタイム。この方法は、オフラインにした実稼働システムのデバッグや、実稼働環境をミラーリングするテスト システムのデバッグに最適です。

ただし、このタイプのログ記録には重要な要件があります。それは、無効なステートメントがパフォーマンスに与える影響を最小限にする必要があります。 C/C では、これは、フラグがチェックされるまで引数の評価を抑制する LOG マクロによって実現されました。

Go での無効なロギングの実装

Go でのこの動作のエミュレーション課題を提示します。 log.Logger で io.Discard を使用することは、無効な場合でもログ メッセージをフォーマットするため、オプションではありません。

EnabledLogger 構造体を使用した最初の試行では、log.Logger インターフェイスが実装され、Enabled に基づいてロギングが有効/無効になります。フラグ。ただし、引数の評価は抑制されないため、任意の関数呼び出しでパフォーマンスの問題が発生する可能性があります。

2 つの回避策

これに対処するには、2 つの回避策があります:

  1. ラッパー タイプ: ラッパー タイプを使用して関数呼び出しを延期し、式が確実に有効なチェックに合格するまで評価されません。
  2. 手動チェック: 有効なチェックでロギング ステートメントを手動でラップし、無効な場合に実行されないようにします。

どちらのアプローチも冗長でエラーが発生しやすいコードとなり、潜在的なパフォーマンス低下への扉を開きます。

その他オプション

Go の静的評価ルールにもかかわらず、いくつかの追加オプションがあります:

  • カスタム ログ フォーマッタ: fmt.Stringer と fmt.GoStringer の利用インターフェイスは実行時まで引数のフォーマットを遅らせることができます。
  • Runtime Loggerスワッピング: ロガー インターフェイスまたはビルド制約を介してロギング メカニズム全体をスワップ アウトできます。
  • Go コード生成: 高度なコード生成技術により、AST と特殊なデバッグ ビルドを生成します。

これらのソリューションは動的なランタイム構成には理想的ではありませんが、特定のパフォーマンスの向上をもたらすことができます。シナリオ。

最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3