ASP.NET Core SignalR でのログと診断

提供 : Andrew AndrewTon-Nurse

この記事では、問題のトラブルシューティングに役立つ診断情報を ASP.NET Core SignalR アプリから収集するためのガイダンスを提供します。

サーバー側のログ

警告

サーバー側のログには、アプリからの機密情報が含まれる場合があります。 運用アプリから GitHub などのパブリック フォーラムに未加工のログを投稿しないでください

SignalR は ASP.NET Core の一部であるため、ASP.NET Core のログ システムが使われます。 既定の構成では、SignalR でログに記録される情報は非常に少量ですが、これは構成可能です。 ASP.NET Core ログの構成の詳細については、ASP.NET Core ログに関するドキュメントを参照してください。

SignalR では 2 つのロガー カテゴリが使われます。

  • Microsoft.AspNetCore.SignalR: ハブ プロトコル、ハブのアクティブ化、メソッドの呼び出し、その他のハブ関連アクティビティに関連するログの場合。
  • Microsoft.AspNetCore.Http.Connections: WebSocket、長いポーリング、Server-Sent イベント、低レベルの SignalR インフラストラクチャなど、トランスポートに関連するログの場合。

SignalR からの詳細なログを有効にするには、Logging 内の LogLevel サブセクションに次の項目を追加して、appsettings.json ファイルの Debug レベルに前記の両方のプレフィックスを構成します。

{
    "Logging": {
        "LogLevel": {
            "Default": "Debug",
            "System": "Information",
            "Microsoft": "Information",
            "Microsoft.AspNetCore.SignalR": "Debug",
            "Microsoft.AspNetCore.Http.Connections": "Debug"
        }
    }
}

CreateWebHostBuilder メソッドのコードでこれを構成することもできます。

public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
    WebHost.CreateDefaultBuilder(args)
        .ConfigureLogging(logging =>
        {
            logging.AddFilter("Microsoft.AspNetCore.SignalR", LogLevel.Debug);
            logging.AddFilter("Microsoft.AspNetCore.Http.Connections", LogLevel.Debug);
        })
        .UseStartup<Startup>();

JSON ベースの構成を使用していない場合は、構成システム内に次の構成値を設定します。

  • Logging:LogLevel:Microsoft.AspNetCore.SignalR = Debug
  • Logging:LogLevel:Microsoft.AspNetCore.Http.Connections = Debug

構成システムのドキュメントを調べて、入れ子になった構成値を指定する方法を確認してください。 たとえば、環境変数の使用時には、: の代わりに 2 つの _ 文字を使用します (例: Logging__LogLevel__Microsoft.AspNetCore.SignalR)。

アプリのより詳細な診断情報を収集する場合は、Debug レベルを使用することが推奨されます。 Trace レベルでは非常に低レベルの診断情報が生成されるため、アプリの問題を診断するために必要となることはまれです。

サーバー側ログにアクセスする

サーバー側のログにアクセスする方法は、実行環境によって異なります。

IIS の外部のコンソール アプリとして

コンソール アプリで実行中の場合は、コンソール ロガーを既定で有効にする必要があります。 SignalR ログがコンソールに表示されるようになります。

Visual Studio から IIS Express 内で

Visual Studio の [出力] ウィンドウにログの出力が表示されます。 [ASP.NET Core Web サーバー] ドロップダウン オプションを選びます。

Azure App Service

Azure App Service ポータルの [診断ログ] セクションで [アプリケーション ログ (ファイル システム)] オプションを有効にし、[レベル] を [Verbose] に構成します。 ログは、ログ ストリーミング サービスから、および App Service のファイル システムのログで、使用できます。 詳しくは、「Azure ログのストリーミング」をご覧ください。

その他の環境

アプリが別の環境 (Docker、Kubernetes、Windows サービスなど) にデプロイされている場合、その環境に適したログ プロバイダーを構成する方法の詳細については、「.NET Core および ASP.NET Core でのログ記録」を参照してください。

JavaScript クライアントのログ記録

警告

クライアント側のログには、アプリからの機密情報が含まれる場合があります。 運用アプリから GitHub などのパブリック フォーラムに未加工のログを投稿しないでください

JavaScript クライアントを使用するときは、HubConnectionBuilderconfigureLogging メソッドを使ってログ オプションを構成できます。

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/my/hub/url")
    .configureLogging(signalR.LogLevel.Debug)
    .build();

フレームワークのログを無効にするには、configureLogging メソッドで signalR.LogLevel.None を指定してください。 一部のログはブラウザーによって直接出力され、ログ レベルの設定では無効にできないことに注意してください。

次の表は、JavaScript クライアントで使用できるログ レベルです。 ログ レベルをこれらの値のいずれかに設定すると、そのレベルおよび表でそれより上にあるすべてのレベルのログが有効になります。

Level 説明
None メッセージはログに記録されません。
Critical アプリ全体でのエラーを示すメッセージ。
Error 現在の操作でのエラーを示すメッセージ。
Warning 致命的ではない問題を示すメッセージ。
Information 情報メッセージ。
Debug デバッグに役立つ診断メッセージ。
Trace 特定の問題を診断するために設計された、非常に詳細な診断メッセージ。

詳細さを構成すると、ログがブラウザー コンソール (または NodeJS アプリの標準出力) に書き込まれるようになります。

カスタム ログ システムにログを送信する場合は、ILogger インターフェイスを実装する JavaScript オブジェクトを指定できます。 実装する必要のあるメソッドは、イベントのレベルとイベントに関連付けられたメッセージを受け取る log だけです。 次に例を示します。

import { ILogger, LogLevel, HubConnectionBuilder } from "@microsoft/signalr";

export class MyLogger implements ILogger {
    log(logLevel: LogLevel, message: string) {
        // Use `message` and `logLevel` to record the log message to your own system
    }
}

// later on, when configuring your connection...

let connection = new HubConnectionBuilder()
    .withUrl("/my/hub/url")
    .configureLogging(new MyLogger())
    .build();
import { ILogger, LogLevel, HubConnectionBuilder } from "@aspnet/signalr";

export class MyLogger implements ILogger {
    log(logLevel: LogLevel, message: string) {
        // Use `message` and `logLevel` to record the log message to your own system
    }
}

// later on, when configuring your connection...

let connection = new HubConnectionBuilder()
    .withUrl("/my/hub/url")
    .configureLogging(new MyLogger())
    .build();

.NET クライアントのログ記録

警告

クライアント側のログには、アプリからの機密情報が含まれる場合があります。 運用アプリから GitHub などのパブリック フォーラムに未加工のログを投稿しないでください

.NET クライアントからログを取得するには、HubConnectionBuilderConfigureLogging メソッドを使います。 これは、WebHostBuilder および HostBuilderConfigureLogging メソッドと同じように動作します。 ASP.NET Core で使用するのと同じログ プロバイダーを構成できます。 ただし、個々のログ プロバイダーについて、NuGet パッケージを手動でインストールして有効にする必要があります。

Blazor WebAssembly アプリに .NET クライアント ログを追加するには、「ASP.NET Core Blazor ログ記録」を参照してください。

[コンソールのログ記録]

コンソール ログを有効にするには、Microsoft.Extensions.Logging.Console パッケージを追加します。 次に、AddConsole メソッドを使って、コンソール ロガーを構成します。

var connection = new HubConnectionBuilder()
    .WithUrl("https://example.com/my/hub/url")
    .ConfigureLogging(logging =>
    {
        // Log to the Console
        logging.AddConsole();

        // This will set ALL logging to Debug level
        logging.SetMinimumLevel(LogLevel.Debug);
    })
    .Build();

デバッグ出力ウィンドウのログ

Visual Studio の [出力] ウィンドウに表示されるようにログを構成することもできます。 Microsoft.Extensions.Logging.Debug パッケージをインストールして、AddDebug メソッドを使います。

var connection = new HubConnectionBuilder()
    .WithUrl("https://example.com/my/hub/url")
    .ConfigureLogging(logging =>
    {
        // Log to the Output Window
        logging.AddDebug();

        // This will set ALL logging to Debug level
        logging.SetMinimumLevel(LogLevel.Debug)
    })
    .Build();

その他のログ プロバイダー

SignalR では、Serilog、Seq、NLog、または Microsoft.Extensions.Logging と統合される他の任意のログ システムなど、他のログ プロバイダーがサポートされています。 ログシステムに ILoggerProvider が用意されている場合は、それを AddProvider で登録できます。

var connection = new HubConnectionBuilder()
    .WithUrl("https://example.com/my/hub/url")
    .ConfigureLogging(logging =>
    {
        // Log to your custom provider
        logging.AddProvider(new MyCustomLoggingProvider());

        // This will set ALL logging to Debug level
        logging.SetMinimumLevel(LogLevel.Debug)
    })
    .Build();

制御の詳細度

アプリ内の他の場所からログを記録している場合、既定のレベルを Debug に変更すると、詳細すぎる場合があります。 フィルターを使って、SignalR ログのログ レベルを構成できます。 これは、サーバーの場合とほぼ同じ方法で、コードで行うことができます。

var connection = new HubConnectionBuilder()
    .WithUrl("https://example.com/my/hub/url")
    .ConfigureLogging(logging =>
    {
        // Register your providers

        // Set the default log level to Information, but to Debug for SignalR-related loggers.
        logging.SetMinimumLevel(LogLevel.Information);
        logging.AddFilter("Microsoft.AspNetCore.SignalR", LogLevel.Debug);
        logging.AddFilter("Microsoft.AspNetCore.Http.Connections", LogLevel.Debug);
    })
    .Build();

ネットワーク トレース

警告

ネットワーク トレースには、アプリによって送信されるすべてのメッセージの完全な内容が含まれています。 運用アプリから GitHub などのパブリック フォーラムに未加工のネットワーク トレースを投稿しないでください

問題が発生した場合は、ネットワーク トレースで役に立つ多くの情報が得られることがあります。 これは、問題の追跡ツールで問題を保管する場合に特に便利です。

Fiddler を使用してネットワーク トレースを収集する (推奨オプション)

この方法はすべてのアプリで使用できます。

Fiddler は、HTTP トレースを収集するための非常に強力なツールです。 telerik.com/fiddler からインストールして起動し、アプリを実行して問題を再現します。 Fiddler は Windows で使用でき、macOS と Linux 用のベータ版もあります。

HTTPS を使用して接続する場合は、Fiddler で確実に HTTPS トラフィックの暗号を解除できるようにするための追加の手順がいくつかあります。 詳しくは、Fiddler のドキュメントをご覧ください。

トレースを収集したら、メニュー バーから [ファイル]>[保存]>[すべてのセッション] の順に選択することで、そのトレースをエクスポートできます。

Exporting all sessions from Fiddler

tcpdump でネットワーク トレースを収集する (macOS および Linux のみ)

この方法はすべてのアプリで使用できます。

tcpdump を使用して未加工の TCP トレースを収集できます。その場合、コマンド シェルから次のコマンドを実行します。 アクセス許可エラーが発生した場合は、root になるか、コマンドの前に sudo を入力する必要があることがあります。

tcpdump -i [interface] -w trace.pcap

[interface] は、取り込むネットワーク インターフェイスに置き換えます。 通常、これは /dev/eth0 (標準イーサネット インターフェイスの場合) または /dev/lo0 (localhost トラフィックの場合) のようになります。 詳細については、ホスト システムの tcpdump man ページを参照してください。

ブラウザーでネットワーク トレースを収集する

この方法は、ブラウザー ベースのアプリに対してのみ機能します。

ほとんどのブラウザー開発者ツールのコンソールには [ネットワーク] タブがあります。これを使用して、ブラウザーとサーバーの間のネットワーク アクティビティを取り込むことができます。 ただし、これらのトレースには、WebSocket とServer-Sent イベントのメッセージは含まれません。 それらのトランスポートを使用している場合は、Fiddler や TcpDump (後述) のようなツールを使う方が適しています。

Microsoft Edge および Internet Explorer

(手順は Edge と Internet Explorer の両方で同じです)

  1. F12 キーを押して開発ツールを開きます
  2. [ネットワーク] タブをクリックします
  3. (必要に応じて) ページを更新し、問題を再現します
  4. ツール バーの [保存] アイコンをクリックし、トレースを "HAR" ファイルとしてエクスポートします。

The Save Icon on the Microsoft Edge Dev Tools Network Tab

Google Chrome

  1. F12 キーを押して開発ツールを開きます
  2. [ネットワーク] タブをクリックします
  3. (必要に応じて) ページを更新し、問題を再現します
  4. 要求の一覧内のどこかを右クリックし、[Save as HAR with content]\(内容を HAR ファイルに保存する\) を選びます。

Mozilla Firefox

  1. F12 キーを押して開発ツールを開きます
  2. [ネットワーク] タブをクリックします
  3. (必要に応じて) ページを更新し、問題を再現します
  4. 要求の一覧内のどこかを右クリックし、[Save All As HAR]\(すべてを HAR として保存\) を選びます

診断ファイルを GitHub のイシューに添付する

拡張子を .txt に変更してから、イシューにドラッグ アンド ドロップすることで、診断ファイルを GitHub のイシューに添付できます。

Note

ログ ファイルまたはネットワーク トレースの内容を、GitHub のイシューに貼り付けないでください。 これらのログとトレースは非常に大きいことがあり、通常、GitHub で切り捨てられます。

Dragging log files on to a GitHub issue

メトリック

メトリックは、一定の間隔でのデータ メジャーの表現です。 たとえば、1 秒あたりの要求数などです。 メトリック データを使用すると、アプリの状態を高レベルで監視できます。 .NET gRPC メトリックは EventCounter を使用して出力されます。

SignalR サーバーのメトリック

SignalR サーバーのメトリックは、Microsoft.AspNetCore.Http.Connections イベント ソースで報告されます。

名前 説明
connections-started 開始された接続の総数
connections-stopped 停止された接続の総数
connections-timed-out タイムアウトした接続の総数
current-connections 現在の接続数
connections-duration 平均接続時間

メトリックを観察する

dotnet-counters は、アドホックな正常性監視と最初のレベルのパフォーマンス調査を目的としたパフォーマンス監視ツールです。 プロバイダー名として Microsoft.AspNetCore.Http.Connections を使って .NET アプリを監視します。 次に例を示します。

> dotnet-counters monitor --process-id 37016 Microsoft.AspNetCore.Http.Connections

Press p to pause, r to resume, q to quit.
    Status: Running
[Microsoft.AspNetCore.Http.Connections]
    Average Connection Duration (ms)       16,040.56
    Current Connections                         1
    Total Connections Started                   8
    Total Connections Stopped                   7
    Total Connections Timed Out                 0

その他のリソース