SignalR トレースを有効にする

Tom FitzMacken

警告

このドキュメントは、SignalR の最新バージョン用ではありません。 SignalR の ASP.NET Coreを見てみましょう。

このドキュメントでは、SignalR サーバーとクライアントのトレースを有効にして構成する方法について説明します。 トレースを使用すると、SignalR アプリケーションのイベントに関する診断情報を表示できます。

このトピックはもともとパトリック・フレッチャーによって書かれました。

チュートリアルで使用するソフトウェアのバージョン

質問とコメント

このチュートリアルを気に入った方法と、ページの下部にあるコメントで改善できる内容に関するフィードバックをお寄せください。 チュートリアルに直接関連していない質問がある場合は、 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>

イベントはアプリケーション ログに記録され、次に示すように、イベント ビューアーを介して使用できます。

SignalR ログを示すイベント ビューアー

Note

イベント ログを使用する場合は、 TraceLevelError に設定して、メッセージの数を管理できるようにします。

.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.OutStreamWriter を使用したファイルへの書き込みは使用できません。 代わりに、トレース用の TextWriter のカスタム実装を作成する必要があります。

クライアント イベントWindows Phone UI へのログ記録

SignalR コードベースには、 というカスタム TextWriter 実装を使用して、トレース出力を TextBlock に書き込むWindows PhoneサンプルがTextBlockWriter含まれています。 このクラスは、 samples/Microsoft.AspNet.SignalR.Client.WP8.Samples プロジェクトにあります 。 の TextBlockWriterインスタンスを作成するときに、現在の SynchronizationContextStackPanel を渡します。ここで、トレース出力に使用する TextBlock が作成されます。

Connection = new HubConnection(ServerURI);
var writer = new TextBlockWriter(SynchronizationContext.Current, StackPanelConsole);
Connection.TraceWriter = writer;
Connection.TraceLevel = TraceLevels.All;

その後、渡した StackPanel で作成された新しい TextBlock にトレース出力が書き込まれます。

出力が表示されたWindows Phoneサンプルを示すスクリーンショット。

クライアント イベント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 クライアントを示しています。 ブラウザー コンソールに接続イベントとハブ呼び出しイベントが表示されます。

ブラウザー コンソールでの SignalR トレース イベント