SignalR トレースを有効にする
警告
このドキュメントは、SignalR の最新バージョン用ではありません。 SignalR の ASP.NET Coreを見てみましょう。
このドキュメントでは、SignalR サーバーとクライアントのトレースを有効にして構成する方法について説明します。 トレースを使用すると、SignalR アプリケーションのイベントに関する診断情報を表示できます。
このトピックはもともとパトリック・フレッチャーによって書かれました。
チュートリアルで使用するソフトウェアのバージョン
- Visual Studio 2013
- .NET Framework 4.5
- SignalR バージョン 2
質問とコメント
このチュートリアルを気に入った方法と、ページの下部にあるコメントで改善できる内容に関するフィードバックをお寄せください。 チュートリアルに直接関連していない質問がある場合は、 ASP.NET SignalR フォーラム または StackOverflow.com に投稿できます。
トレースが有効になっている場合、SignalR アプリケーションはイベントのログ エントリを作成します。 クライアントとサーバーの両方からイベントをログに記録できます。 サーバー ログ接続、スケールアウト プロバイダー、メッセージ バス イベントをトレースします。 クライアントログ接続イベントをトレースします。 SignalR 2.1 以降では、クライアントでトレースすると、ハブ呼び出しメッセージの完全なコンテンツがログに記録されます。
内容
サーバーでのトレースの有効化
アプリケーションの構成ファイル内のサーバーでトレースを有効にします (プロジェクトの種類に応じて、App.configまたはWeb.config)。ログに記録するイベントのカテゴリを指定します。 構成ファイルでは、 TraceListener の実装を使用して、イベントをテキスト ファイル、Windows イベント ログ、またはカスタム ログに記録するかどうかを指定します。
サーバー イベント カテゴリには、次の種類のメッセージが含まれます。
source | メッセージ |
---|---|
SignalR.SqlMessageBus | SQL Message Bus スケールアウト プロバイダーのセットアップ、データベース操作、エラー、タイムアウト イベント |
SignalR.ServiceBusMessageBus | Service Bus スケールアウト プロバイダーのトピックの作成とサブスクリプション、エラー、メッセージング イベント |
SignalR.RedisMessageBus | Redis スケールアウト プロバイダーの接続、切断、エラー イベント |
SignalR.ScaleoutMessageBus | スケールアウト メッセージング イベント |
SignalR.Transports.WebSocketTransport | WebSocket トランスポート接続、切断、メッセージング、エラー イベント |
SignalR.Transports.ServerSentEventsTransport | ServerSentEvents トランスポート接続、切断、メッセージング、エラー イベント |
SignalR.Transports.ForeverFrameTransport | ForeverFrame トランスポート接続、切断、メッセージング、エラー イベント |
SignalR.Transports.LongPollingTransport | LongPolling トランスポート接続、切断、メッセージング、およびエラー イベント |
SignalR.Transports.TransportHeartBeat | トランスポート接続、切断、キープアライブ イベント |
SignalR.ReflectedHubDescriptorProvider | ハブ検出イベント |
サーバー イベントをテキスト ファイルに記録する
次のコードは、イベントのカテゴリごとにトレースを有効にする方法を示しています。 このサンプルでは、イベントをテキスト ファイルに記録するようにアプリケーションを構成します。
トレースを有効にする XML サーバー コード
<system.diagnostics>
<sources>
<source name="SignalR.SqlMessageBus">
<listeners>
<add name="SignalR-Bus" />
</listeners>
</source>
<source name="SignalR.ServiceBusMessageBus">
<listeners>
<add name="SignalR-Bus" />
</listeners>
</source>
<source name="SignalR.RedisMessageBus">
<listeners>
<add name="SignalR-Bus" />
</listeners>
</source>
<source name="SignalR.ScaleoutMessageBus">
<listeners>
<add name="SignalR-Bus" />
</listeners>
</source>
<source name="SignalR.Transports.WebSocketTransport">
<listeners>
<add name="SignalR-Transports" />
</listeners>
</source>
<source name="SignalR.Transports.ServerSentEventsTransport">
<listeners>
<add name="SignalR-Transports" />
</listeners>
</source>
<source name="SignalR.Transports.ForeverFrameTransport">
<listeners>
<add name="SignalR-Transports" />
</listeners>
</source>
<source name="SignalR.Transports.LongPollingTransport">
<listeners>
<add name="SignalR-Transports" />
</listeners>
</source>
<source name="SignalR.Transports.TransportHeartBeat">
<listeners>
<add name="SignalR-Transports" />
</listeners>
</source>
<source name="SignalR.ReflectedHubDescriptorProvider">
<listeners>
<add name="SignalR-Init" />
</listeners>
</source>
</sources>
<!-- Sets the trace verbosity level -->
<switches>
<add name="SignalRSwitch" value="Verbose" />
</switches>
<!-- Specifies the trace writer for output -->
<sharedListeners>
<!-- Listener for transport events -->
<add name="SignalR-Transports" type="System.Diagnostics.TextWriterTraceListener" initializeData="transports.log.txt" />
<!-- Listener for scaleout provider events -->
<add name="SignalR-Bus" type="System.Diagnostics.TextWriterTraceListener" initializeData="bus.log.txt" />
<!-- Listener for hub discovery events -->
<add name="SignalR-Init" type="System.Diagnostics.TextWriterTraceListener" initializeData="init.log.txt" />
</sharedListeners>
<trace autoflush="true" />
</system.diagnostics>
上記のコードでは、エントリは SignalRSwitch
、指定したログに送信されるイベントに使用される TraceLevel を指定します。 この場合は、 に Verbose
設定されます。つまり、すべてのデバッグ メッセージとトレース メッセージがログに記録されます。
次の出力は、上記の構成ファイルを transports.log.txt
使用したアプリケーションのファイルからのエントリを示しています。 新しい接続、削除された接続、トランスポート ハートビート イベントが表示されます。
SignalR.Transports.TransportHeartBeat Information: 0 : Connection 9aa62c9b-09b3-416c-b367-06520e24f780 is New.
SignalR.Transports.TransportHeartBeat Verbose: 0 : KeepAlive(9aa62c9b-09b3-416c-b367-06520e24f780)
SignalR.Transports.TransportHeartBeat Verbose: 0 : KeepAlive(9aa62c9b-09b3-416c-b367-06520e24f780)
SignalR.Transports.TransportHeartBeat Verbose: 0 : KeepAlive(9aa62c9b-09b3-416c-b367-06520e24f780)
SignalR.Transports.WebSocketTransport Information: 0 : CloseSocket(9aa62c9b-09b3-416c-b367-06520e24f780)
SignalR.Transports.WebSocketTransport Information: 0 : Abort(9aa62c9b-09b3-416c-b367-06520e24f780)
SignalR.Transports.TransportHeartBeat Information: 0 : Removing connection 9aa62c9b-09b3-416c-b367-06520e24f780
SignalR.Transports.WebSocketTransport Information: 0 : End(9aa62c9b-09b3-416c-b367-06520e24f780)
SignalR.Transports.WebSocketTransport Verbose: 0 : DrainWrites(9aa62c9b-09b3-416c-b367-06520e24f780)
SignalR.Transports.WebSocketTransport Information: 0 : CompleteRequest (9aa62c9b-09b3-416c-b367-06520e24f780)
サーバー イベントをイベント ログに記録する
テキスト ファイルではなくイベント ログにイベントを記録するには、ノード内のエントリの値を sharedListeners
変更します。 次のコードは、サーバー イベントをイベント ログに記録する方法を示しています。
イベント ログにイベントをログ記録するための XML サーバー コード
<sharedListeners>
<!-- Listener for transport events -->
<add name="SignalR-Transports" type="System.Diagnostics.EventLogTraceListener" initializeData="SignalRTransportLog" />
<!-- Listener for scaleout provider events -->
<add name="SignalR-Bus" type="System.Diagnostics.EventLogTraceListener" initializeData="SignalRScaleoutLog" />
<!-- Listener for hub discovery events -->
<add name="SignalR-Init" type="System.Diagnostics.EventLogTraceListener" initializeData="SignalRInitLog" />
</sharedListeners>
イベントはアプリケーション ログに記録され、次に示すように、イベント ビューアーを介して使用できます。
Note
イベント ログを使用する場合は、 TraceLevel を Error に設定して、メッセージの数を管理できるようにします。
.NET クライアントでのトレースの有効化 (Windows デスクトップ アプリ)
.NET クライアントは、 TextWriter の実装を使用して、コンソール、テキスト ファイル、またはカスタム ログにイベントをログに記録できます。
.NET クライアントでログ記録を有効にするには、接続の TraceLevel
プロパティを TraceLevels 値に設定し、 プロパティを TraceWriter
有効な TextWriter インスタンスに設定します。
コンソールへのデスクトップ クライアント イベントのログ記録
次の C# コードは、.NET クライアントのイベントをコンソールに記録する方法を示しています。
var hubConnection = new HubConnection("http://www.contoso.com/");
hubConnection.TraceLevel = TraceLevels.All;
hubConnection.TraceWriter = Console.Out;
IHubProxy stockTickerHubProxy = hubConnection.CreateHubProxy("StockTickerHub");
stockTickerHubProxy.On<Stock>("UpdateStockPrice", stock => Console.WriteLine("Stock update for {0} new price {1}", stock.Symbol, stock.Price));
await hubConnection.Start();
デスクトップ クライアント イベントをテキスト ファイルに記録する
次の C# コードは、.NET クライアントのイベントをテキスト ファイルに記録する方法を示しています。
var hubConnection = new HubConnection("http://www.contoso.com/");
var writer = new StreamWriter("ClientLog.txt");
writer.AutoFlush = true;
hubConnection.TraceLevel = TraceLevels.All;
hubConnection.TraceWriter = writer;
IHubProxy stockTickerHubProxy = hubConnection.CreateHubProxy("StockTickerHub");
stockTickerHubProxy.On<Stock>("UpdateStockPrice", stock => Console.WriteLine("Stock update for {0} new price {1}", stock.Symbol, stock.Price));
await hubConnection.Start();
次の出力は、上記の構成ファイルを ClientLog.txt
使用したアプリケーションのファイルからのエントリを示しています。 サーバーに接続しているクライアントと、 というクライアント addMessage
メソッドを呼び出すハブが示されています。
19:41:39.9103763 - null - ChangeState(Disconnected, Connecting)
19:41:40.3750726 - dd61fd48-d796-4518-b36b-ec1dcb970d72 - WS Connecting to: ws://localhost:8080/signalr/signalr/connect?transport=webSockets&clientProtocol=1.4&connectionToken=AQAAANCMnd8BFdERjHoAwE%2FCl%2BsBAAAAh8Lp
KH5%2FDkCQeR4ALAwR%2BAAAAAACAAAAAAADZgAAwAAAABAAAADHpCa7wm%2FbOhjluf%2Fm9GA9AAAAAASAAACgAAAAEA
AAAEqRfJihLExRI6tZy7lWRwYoAAAApotSsJXW0OiwEgiUUi0pzhK6oKbz%2BkMeVbezuEDQLnJecM9otFe9PRQAAAAuHK
BlOnPmXt%2FhXV%2Felr1QvC156Q%3D%3D&connectionData=[{"Name":"MyHub"}]
19:41:40.4442923 - dd61fd48-d796-4518-b36b-ec1dcb970d72 - WS: OnMessage({"C":"d-5196BF5C-A,0|B,0|C,1|D,0","S":1,"M":[]})
19:41:40.4874324 - dd61fd48-d796-4518-b36b-ec1dcb970d72 - ChangeState(Connecting, Connected)
19:41:47.4511770 - dd61fd48-d796-4518-b36b-ec1dcb970d72 - WS: OnMessage({"C":"d-5196BF5C-A,1|B,0|C,1|D,0","M":[{"H":"MyHub","M":"addMessage","A":["User One","Hello!"]}]})
19:41:47.4576968 - dd61fd48-d796-4518-b36b-ec1dcb970d72 - WS: OnMessage({"I":"0"})
19:41:50.3959119 - dd61fd48-d796-4518-b36b-ec1dcb970d72 - WS: OnMessage({})
19:41:50.8928084 - dd61fd48-d796-4518-b36b-ec1dcb970d72 - WS: OnMessage({"C":"d-5196BF5C-A,2|B,0|C,1|D,0","M":[{"H":"MyHub","M":"addMessage","A":["User Two","Hello!"]}]})
Windows Phone 8 クライアントでのトレースの有効化
Windows Phone アプリ用の SignalR アプリケーションでは、デスクトップ アプリと同じ .NET クライアントが使用されますが、Console.Out と StreamWriter を使用したファイルへの書き込みは使用できません。 代わりに、トレース用の TextWriter のカスタム実装を作成する必要があります。
クライアント イベントWindows Phone UI へのログ記録
SignalR コードベースには、 というカスタム TextWriter 実装を使用して、トレース出力を TextBlock に書き込むWindows PhoneサンプルがTextBlockWriter
含まれています。 このクラスは、 samples/Microsoft.AspNet.SignalR.Client.WP8.Samples プロジェクトにあります 。 の TextBlockWriter
インスタンスを作成するときに、現在の SynchronizationContext と StackPanel を渡します。ここで、トレース出力に使用する TextBlock が作成されます。
Connection = new HubConnection(ServerURI);
var writer = new TextBlockWriter(SynchronizationContext.Current, StackPanelConsole);
Connection.TraceWriter = writer;
Connection.TraceLevel = TraceLevels.All;
その後、渡した StackPanel で作成された新しい TextBlock にトレース出力が書き込まれます。
クライアント イベントWindows Phoneデバッグ コンソールへのログ記録
UI ではなくデバッグ コンソールに出力を送信するには、デバッグ ウィンドウに書き込む TextWriter の実装を作成し、接続の TraceWriter プロパティに割り当てます。
Connection = new HubConnection(ServerURI);
var writer = new DebugTextWriter();
Connection.TraceWriter = writer;
Connection.TraceLevel = TraceLevels.All;
...
private class DebugTextWriter : TextWriter
{
private StringBuilder buffer;
public DebugTextWriter()
{
buffer = new StringBuilder();
}
public override void Write(char value)
{
switch (value)
{
case '\n':
return;
case '\r':
Debug.WriteLine(buffer.ToString());
buffer.Clear();
return;
default:
buffer.Append(value);
break;
}
}
public override void Write(string value)
{
Debug.WriteLine(value);
}
#region implemented abstract members of TextWriter
public override Encoding Encoding
{
get { throw new NotImplementedException(); }
}
#endregion
}
その後、トレース情報が Visual Studio のデバッグ ウィンドウに書き込まれます。
JavaScript クライアントでのトレースの有効化
接続でクライアント側のログ記録を有効にするには、 メソッドを logging
呼び出して接続を確立する前に、接続オブジェクトの start
プロパティを設定します。
(生成されたプロキシを使用して) ブラウザー コンソールへのトレースを有効にするクライアント JavaScript コード
$.connection.hub.logging = true;
$.connection.hub.start();
(生成されたプロキシを使用せずに) ブラウザー コンソールへのトレースを有効にするクライアント JavaScript コード
var connection = $.hubConnection();
connection.logging = true;
connection.start();
トレースが有効になっている場合、JavaScript クライアントはブラウザー コンソールにイベントを記録します。 ブラウザー コンソールにアクセスするには、「 トランスポートの監視」を参照してください。
次のスクリーンショットは、トレースが有効になっている SignalR JavaScript クライアントを示しています。 ブラウザー コンソールに接続イベントとハブ呼び出しイベントが表示されます。