ログには、次のようなベスト プラクティスがあります。
文字列の書式設定や補間は使用しない。
$"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
を使用する。 - エンコードジョブが失敗した場合などに、
LogWarningObject
、LogErrorObject
、または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 の既定のカスタム プロパティには、EventId
、Category
、および 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 モジュール: