Go のトレース ログには、クリティカル パスで無効になっているログ ステートメントのコストを最小限に抑えるという独特の課題があります。 C/C とは異なり、Go にはプリプロセッサ マクロがないため、代替ソリューションを検討する必要があります。
1 つのアプローチには、 fmt.Stringer および fmt.GoStringer インターフェイスの使用が含まれます。ログの実行までフォーマットを遅らせることで、ログ引数での高価な関数呼び出しを回避できます。
type LogFormatter interface { LogFormat() string } // Inside the logger if i, ok := i.(LogFormatter); ok { fmt.Println(i.LogFormat()) }
もう 1 つの戦略は、ロガー インターフェイスを使用して実行時に、またはビルド制約を使用してビルド時にロガーを交換することです。ただし、これには、負荷の高い呼び出しがロギング引数に挿入されていないことを確認する必要があります。
3 番目のオプションは、Logger 自体を bool として定義し、冗長性を減らしながらロギングを制御する簡潔な方法を提供することです。
type Log bool func (l Log) Println(args ...interface{}) { fmt.Println(args...) } var debug Log = false if debug { debug.Println("DEBUGGING") }
最後に、コード生成を検討できますが、これはランタイム構成には適していません。 gofmt -r を使用するか、テキスト/テンプレートを使用してファイルをビルドすることにより、特定のデバッグ シナリオ用に個別のデバッグ ビルドを作成できます。
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3