.NET でのログ プロバイダー

ログ プロバイダーはログを保持します。ただし、Console プロバイダーはログを標準出力としてのみ表示します。 たとえば、Azure Application Insights プロバイダーでは、Azure Application Insights にログが保存されます。 複数のプロバイダーを有効にすることができます。

既定の .NET Worker アプリ テンプレート:

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 を呼び出し、必要なログ プロバイダーを追加します。 コード例を次に示します。

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 によって、DebugLogger のインスタンスが作成されます。これは、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 ストレージにログを書き込みます。

プロバイダー パッケージは、ランタイム ライブラリに含まれていません。 プロバイダーを使用するには、プロバイダー パッケージをプロジェクトに追加します。

プロバイダーの設定を構成するには、次の例のように AzureFileLoggerOptionsAzureBlobLoggerOptions を使用します。

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 ツールを使ってクエリを実行し、ログを分析できます。

詳細については、次のリソースを参照してください。

ログ プロバイダーの設計に関する考慮事項

ILoggerProvider インターフェイスの独自の実装と、ILogger の対応するカスタム実装を開発する計画がある場合は、次の点を考慮してください。

  • ILogger.Log メソッドは、同期的です。
  • ログの状態とオブジェクトの有効期間は、想定しないでください。

ILoggerProvider の実装では、その ILoggerProvider.CreateLogger メソッドを介して ILogger を作成します。 ご利用の実装で、非ブロッキング方式によりログ メッセージをキューに登録することを目標とする場合は、最初にメッセージを具体化するか、ログ エントリの具体化に使用されるオブジェクトの状態をシリアル化する必要があります。 そうすることで、オブジェクトの破棄により例外が発生する可能性を回避できます。

詳細については、「.NET にカスタム ログ プロバイダーを実装する」を参照してください。

サードパーティ製のログ プロバイダー

ここでは、さまざまな .NET ワークロードで使用できるサードパーティ製のログ記録フレームワークをいくつか紹介します。

一部のサードパーティ製フレームワークは、セマンティック ログ記録 (構造化ログ記録とも呼ばれます) を実行できます。

サード パーティ製フレームワークを使用することは、組み込みのプロバイダーのいずれかを使用することと似ています。

  1. プロジェクトに NuGet パッケージを追加します。
  2. ログ記録フレームワークによって提供される ILoggerFactory または ILoggingBuilder 拡張メソッドを呼び出します。

詳細については、各プロバイダーのドキュメントをご覧ください。 サード パーティ製のログ プロバイダーは、Microsoft ではサポートされていません。

関連項目