Gridwich でのログ

Azure

ログには、次のようなベスト プラクティスがあります。

  • 文字列の書式設定や補間は使用しない。 $"This broke {brokenThing}" を使用した文字列のログは、デバッグに役立たない。

  • オブジェクトが検索可能なフィールドになるように渡す。

    LogInformation(LogEventIds.StartProcessing, $"Processing has started on item {Item.itemNumber}"); の代わりに以下を使用してください。

    • LogInformationObject(LogEventIds.StartProcessing, Item); のようなオブジェクトまたは
    • LogInformationObject(LogEventIds.StartProcessing, new {Item.itemNumber, Item.itemDescription, someData}); のような匿名オブジェクト。
  • LogEventIds に記載されている EventId の番号付け規則に従う。

  • 重要な作業の主部については、次のログ パターンを使用する。

    • たとえば、エンコード ジョブを開始するときに、エントリで LogInformationObject を使用する。
    • エンコード ジョブが成功した場合などに、成功時に LogInformationObject を使用する。
    • エンコードジョブが失敗した場合などに、LogWarningObjectLogErrorObject、または LogCriticalObject を使用する。 該当する場合は、例外メソッド バリアントを使用する。
  • 任意のステージで任意の情報をログに記録することはできますが、不要なノイズでログを汚さない。

ObjectLogger

IObjectLogger を備えた ObjectLogger は、標準的な Logger/ILogger の小さなラッパー ユーティリティです。 このワンライナー ユーティリティでは、 C# オブジェクトをロガーが使用できる辞書オブジェクトに変換することにより、任意の C# オブジェクトをログに記録します。

ObjectLogger/IObjectLogger は、継承ではなく、アダプター パターンを使用して EventIds のないロガー メソッドの使用を制限します。 この制限により、開発者は、デバッグに役立つ EventIds を強制的に使用するようになります。

ObjectLogger を使用するためのその他の推奨事項は次のとおりです。

  • ILogger を使用して IObjectLogger をバイパスしない。
  • IObjectLogger をクラスに対して適切な型 (IObjectLogger<myClass>) で使用する。
  • 例外処理の catch ブロックでは、例外を含む IObjectLogger メソッドを使用します。 Application Insights などのログ プロバイダーでは、例外情報を使用できます。

スキーマとデータのログ

基になる Event Grid ランタイム インフラストラクチャにより、基本スキーマが提供されます。 Event Grid イベント スキーマには、イベント時間、配信元のデバイス、重大度レベル、および文字列メッセージが含まれます。 Logger/ILogger の既定のカスタム プロパティには、EventIdCategory、および RequestPath が含まれます。

コンテキスト オブジェクト

複数の入力と出力を必要とする複雑な API とワークフローを操作するには、コンテキスト オブジェクトを作成します。これは、コードで渡すことができる重要な変数の一連のプロパティです。 コンテキスト オブジェクトは多くのパラメーターを扱うことができ、パラメーターを追加または削除するときにメソッド シグネチャを変更する必要はありません。 また、コンテキスト オブジェクトをロガーおよびその他のインターフェイスに 1 つの単位として渡すこともできます。

たとえば、次の表記の代わりに、

var store = new StorageBlob();
var tier = req.Query["tier"];
var result = await store.SetBlobStorageTier(blobName, tier);
logger.LogInformationObject(LogEventIds.setBlobProperties, result);

次のコードを使用できます。

var storageContext = new StorageContext();
storageContext.Store = new StorageBlob();
storageContext.Tier = req.Query["tier"];
storageContext.Result = await store.SetBlobStorageTier(blobName, storageContext.Tier);
logger.LogInformationObject(LogEventIds.setBlobProperties, storageContext);

ログ レベル

適切なログ レベルを割り当てるのは簡単ではない可能性があります。 次のログ レベルの一般的な説明は LogLevel Enumからのものです。

Loglevel Enum 説明
LogTrace 0 最も詳細なメッセージが含まれており、機密性の高いアプリケーション データが含まれている場合があります。 これらのメッセージは既定では無効になっており、運用環境では有効にしないでください。
LogDebug 1 開発中にインタラクティブな調査を行うために使用されます。 これらのログには、主にデバッグに役立つ情報が含まれており、長期的な価値はありません。
LogInformation 2 アプリの一般的なフローを追跡します。 これらのログには長期的な値を含める必要があります。
LogWarning 3 アプリケーション フロー内の異常または予期しないイベントを強調するが、アプリケーションの実行を停止することはないログです。
LogError 4 エラーが発生したために現在の実行フローが停止した場合にログします。 これらのログは、アプリケーション全体の障害ではなく、現在のアクティビティの失敗を示している必要があります。
LogCritical 5 回復不可能なアプリケーションまたはシステムのクラッシュ、または早急に対処する必要がある重大な障害について説明します。
LogNone 6 ログ メッセージの記述には使用されません。 ログのカテゴリにメッセージを記述しないように指定します。

次のステップ

製品ドキュメント:

Microsoft Learn モジュール: