.NET でのログ プロバイダー
ログ プロバイダーはログを保持します。ただし、Console
プロバイダーはログを標準出力としてのみ表示します。 たとえば、Azure Application Insights プロバイダーでは、Azure Application Insights にログが保存されます。 複数のプロバイダーを有効にすることができます。
既定の .NET Worker アプリ テンプレート:
- 汎用ホストが使用されます。
- CreateApplicationBuilder が呼び出されます。これにより、次のログ プロバイダーが追加されます。
- コンソール
- デバッグ
- EventSource
- EventLog (Windows のみ)
using Microsoft.Extensions.Hosting;
using IHost host = Host.CreateApplicationBuilder(args).Build();
// Application code should start here.
await host.RunAsync();
上記のコードは、.NET Worker アプリ テンプレートを使用して作成された Program
クラスを示しています。 以降のいくつかのセクションでは、汎用ホストを使用する .NET Worker アプリ テンプレートに基づくサンプルを提供します。
Host.CreateApplicationBuilder
によって追加されたログ プロバイダーの既定のセットをオーバーライドするには、ClearProviders
を呼び出し、必要なログ プロバイダーを追加します。 コード例を次に示します。
- ClearProviders を呼び出して、ビルダーからすべての ILoggerProvider インスタンスを削除します。
- Console ログ プロバイダーを追加します。
HostApplicationBuilder builder = Host.CreateApplicationBuilder(args);
builder.Logging.ClearProviders();
builder.Logging.AddConsole();
その他のプロバイダーについては、以下を参照してください。
ILogger に依存するサービスを構成する
ILogger<T>
に依存するサービスを構成するには、コンストラクターの挿入を使用するか、ファクトリ メソッドを指定します。 ファクトリ メソッドの方法は、他の選択肢がない場合にのみお勧めします。 たとえば、DI によって提供される ILogger<T>
インスタンスを必要とするサービスについて考えてみます。
HostApplicationBuilder builder = Host.CreateApplicationBuilder(args);
builder.Services.AddSingleton<IExampleService>(
container => new DefaultExampleService
{
Logger = container.GetRequiredService<ILogger<IExampleService>>()
});
上記のコードは、DI コンテナーで IExampleService
のインスタンスを初めて構築する必要があるときに実行される Func<IServiceProvider, IExampleService> です。 この方法では、任意の登録済みサービスにアクセスできます。
組み込みのログ プロバイダー
Microsoft 拡張機能には、ランタイム ライブラリの一部として次のログ プロバイダーが含まれています。
次のログ プロバイダーは、Microsoft によって出荷されますが、ランタイム ライブラリの一部としては提供されません。 これらは追加の NuGet パッケージとしてインストールする必要があります。
コンソール
Console
プロバイダーでは、コンソールへの出力がログに記録されます。
デバッグ
Debug
プロバイダーにより、System.Diagnostics.Debug クラスを使用して (具体的には Debug.WriteLine メソッドを通して)、デバッガーがアタッチされている場合にのみ、ログ出力が書き込まれます。 DebugLoggerProvider は、ILogger
インターフェイスを実装するロガー クラスのインスタンスを作成します。
イベント ソース
EventSource
プロバイダーでは、Microsoft-Extensions-Logging
という名前のクロスプラットフォーム イベント ソースに書き込まれます。 Windows では、プロバイダーによって ETW が使用されます。
dotnet trace ツール
dotnet-trace ツールは、実行中のプロセスの .NET Core のトレースのコレクションを有効にする、クロスプラットフォームの CLI グローバル ツールです。 このツールでは、LoggingEventSource を使用して Microsoft.Extensions.Logging.EventSource プロバイダー データを収集します。
インストール手順については、dotnet-trace に関するページを参照してください。 dotnet-trace
を使用した診断チュートリアルについては、「.NET Core で高い CPU 使用率をデバッグする」を参照してください。
Windows EventLog
EventLog
プロバイダーにより、ログ出力が Windows イベント ログに送信されます。 他のプロバイダーとは異なり、EventLog
プロバイダーでは既定のプロバイダー以外の設定が継承 "されません"。 EventLog
ログ設定が指定されていない場合は、既定の LogLevel.Warning
になります。
LogLevel.Warning より下のイベントをログに記録するには、ログ レベルを明示的に設定してください。 次の例では、イベント ログの既定のログ レベルを LogLevel.Information に設定します。
"Logging": {
"EventLog": {
"LogLevel": {
"Default": "Information"
}
}
}
AddEventLog のオーバーロードを使用すると、EventLogSettings を渡すことができます。 null
または指定しない場合は、次の既定の設定が使用されます。
LogName
:"Application"SourceName
: ".NET Runtime"MachineName
:ローカル コンピューター名が使用されます。
次のコードでは、SourceName
が既定値の ".NET Runtime"
から CustomLogs
に変更されます。
HostApplicationBuilder builder = Host.CreateApplicationBuilder(args);
builder.Logging.AddEventLog(
config => config.SourceName = "CustomLogs");
using IHost host = builder.Build();
host.Run();
Azure App Service
Microsoft.Extensions.Logging.AzureAppServices プロバイダー パッケージは、Azure App Service アプリのファイル システムのテキスト ファイルと、Azure Storage アカウントの BLOB ストレージにログを書き込みます。
プロバイダー パッケージは、ランタイム ライブラリに含まれていません。 プロバイダーを使用するには、プロバイダー パッケージをプロジェクトに追加します。
プロバイダーの設定を構成するには、次の例のように AzureFileLoggerOptions と AzureBlobLoggerOptions を使用します。
using Microsoft.Extensions.Logging.AzureAppServices;
HostApplicationBuilder builder = Host.CreateApplicationBuilder(args)
builder.Logging.AddAzureWebAppDiagnostics();
builder.Services.Configure<AzureFileLoggerOptions>(options =>
{
options.FileName = "azure-diagnostics-";
options.FileSizeLimit = 50 * 1024;
options.RetainedFileCountLimit = 5;
});
builder.Services.Configure<AzureBlobLoggerOptions>(options =>
{
options.BlobName = "log.txt";
});
using IHost host = builder.Build();
// Application code should start here.
await host.RunAsync();
Azure App Service にデプロイされると、Azure portal の [App Service] ページの [App Service ログ] セクションの設定がアプリで使用されます。 次の設定が更新されると、アプリの再起動や再デプロイを必要とせずに、変更がすぐに有効になります。
ログ ファイルの既定の場所は、D:\home\LogFiles\Application フォルダーの中です。 追加の既定値はプロバイダーによって異なります。
- アプリケーション ログ (ファイル システム): 既定のファイル システム ファイル名は diagnostics-yyyymmdd.txtです。 既定のファイル サイズ制限は 10 MB です。保持されるファイルの既定の最大数は 2 です。
- アプリケーション ログ (BLOB): 既定の BLOB 名は {app-name}/yyyy/mm/dd/hh/{guid}_applicationLog.txt です。
このプロバイダーは、プロジェクトが Azure 環境で実行される場合にのみログを記録します。
Azure ログのストリーミング
Azure ログのストリーミングでは、以下からのリアル タイムでのログ アクティビティの表示がサポートされています。
- アプリ サーバー
- Web サーバー
- 失敗した要求のトレース
Azure ログのストリーミングを構成するには
- アプリのポータル ページから [App Service ログ] ページに移動します。
- [アプリケーション ログ (ファイル システム)] を [オン] に設定します。
- ログ [レベル] を選択します。 この設定は、Azure ログ ストリーミングにのみ適用されます。
[ログ ストリーム] ページに移動して、ログを表示します。 ログに記録されたメッセージは、ILogger
インターフェイスを使用してログに記録されます。
Azure Application Insights
Microsoft.Extensions.Logging.ApplicationInsights プロバイダー パッケージでは、Azure Application Insights にログが書き込まれます。 Application Insights は、Web アプリを監視するサービスであり、クエリを実行してテレメトリ データを分析するためのツールを提供します。 このプロバイダーを使用する場合は、Application Insights ツールを使ってクエリを実行し、ログを分析できます。
詳細については、次のリソースを参照してください。
- Application Insights の概要
- ApplicationInsightsLoggerProvider for .NET Core ILogger ログ - ログ プロバイダーを実装し、Application Insights テレメトリのそれ以外の部分は除く場合は、ここから開始します。
- Application Insights のログ アダプター。
- Application Insights SDK のインストール、構成、および初期化 - Microsoft Learn サイト上にある対話型のチュートリアルです。
ログ プロバイダーの設計に関する考慮事項
ILoggerProvider インターフェイスの独自の実装と、ILogger の対応するカスタム実装を開発する計画がある場合は、次の点を考慮してください。
- ILogger.Log メソッドは、同期的です。
- ログの状態とオブジェクトの有効期間は、想定しないでください。
ILoggerProvider
の実装では、その ILoggerProvider.CreateLogger メソッドを介して ILogger
を作成します。 ご利用の実装で、非ブロッキング方式によりログ メッセージをキューに登録することを目標とする場合は、最初にメッセージを具体化するか、ログ エントリの具体化に使用されるオブジェクトの状態をシリアル化する必要があります。 そうすることで、オブジェクトの破棄により例外が発生する可能性を回避できます。
詳細については、「.NET にカスタム ログ プロバイダーを実装する」を参照してください。
サードパーティ製のログ プロバイダー
ここでは、さまざまな .NET ワークロードで使用できるサードパーティ製のログ記録フレームワークをいくつか紹介します。
- elmah.io (GitHub リポジトリ)
- Gelf (GitHub リポジトリ)
- JSNLog (GitHub リポジトリ)
- KissLog.net (GitHub リポジトリ)
- Log4Net (GitHub リポジトリ)
- NLog (GitHub リポジトリ)
- NReco.Logging (GitHub リポジトリ)
- Sentry (GitHub リポジトリ)
- Serilog (GitHub リポジトリ)
- Stackdriver (GitHub リポジトリ)
一部のサードパーティ製フレームワークは、セマンティック ログ記録 (構造化ログ記録とも呼ばれます) を実行できます。
サード パーティ製フレームワークを使用することは、組み込みのプロバイダーのいずれかを使用することと似ています。
- プロジェクトに NuGet パッケージを追加します。
- ログ記録フレームワークによって提供される
ILoggerFactory
またはILoggingBuilder
拡張メソッドを呼び出します。
詳細については、各プロバイダーのドキュメントをご覧ください。 サード パーティ製のログ プロバイダーは、Microsoft ではサポートされていません。
関連項目
.NET