ASP.NET Core SignalR でのログと診断
この記事では、問題のトラブルシューティングに役立つ診断情報を 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 クライアントを使用するときは、HubConnectionBuilder
の configureLogging
メソッドを使ってログ オプションを構成できます。
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 クライアントからログを取得するには、HubConnectionBuilder
の ConfigureLogging
メソッドを使います。 これは、WebHostBuilder
および HostBuilder
の ConfigureLogging
メソッドと同じように動作します。 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 のドキュメントをご覧ください。
トレースを収集したら、メニュー バーから [ファイル]>[保存]>[すべてのセッション] の順に選択することで、そのトレースをエクスポートできます。
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 の両方で同じです)
- F12 キーを押して開発ツールを開きます
- [ネットワーク] タブをクリックします
- (必要に応じて) ページを更新し、問題を再現します
- ツール バーの [保存] アイコンをクリックし、トレースを "HAR" ファイルとしてエクスポートします。
Google Chrome
- F12 キーを押して開発ツールを開きます
- [ネットワーク] タブをクリックします
- (必要に応じて) ページを更新し、問題を再現します
- 要求の一覧内のどこかを右クリックし、[Save as HAR with content]\(内容を HAR ファイルに保存する\) を選びます。
Mozilla Firefox
- F12 キーを押して開発ツールを開きます
- [ネットワーク] タブをクリックします
- (必要に応じて) ページを更新し、問題を再現します
- 要求の一覧内のどこかを右クリックし、[Save All As HAR]\(すべてを HAR として保存\) を選びます
診断ファイルを GitHub のイシューに添付する
拡張子を .txt
に変更してから、イシューにドラッグ アンド ドロップすることで、診断ファイルを GitHub のイシューに添付できます。
Note
ログ ファイルまたはネットワーク トレースの内容を、GitHub のイシューに貼り付けないでください。 これらのログとトレースは非常に大きいことがあり、通常、GitHub で切り捨てられます。
メトリック
メトリックは、一定の間隔でのデータ メジャーの表現です。 たとえば、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
その他のリソース
ASP.NET Core