SignalR 추적 사용

Tom FitzMacken

경고

이 설명서는 최신 버전의 SignalR용이 아닙니다. ASP.NET Core SignalR을 살펴보세요.

이 문서에서는 SignalR 서버 및 클라이언트에 대한 추적을 사용하도록 설정하고 구성하는 방법을 설명합니다. 추적을 사용하면 SignalR 애플리케이션의 이벤트에 대한 진단 정보를 볼 수 있습니다.

이 주제는 원래 패트릭 플레처에 의해 작성되었습니다.

자습서에서 사용되는 소프트웨어 버전

질문 및 의견

이 자습서를 어떻게 좋아했는지, 그리고 페이지 아래쪽의 메모에서 개선할 수 있는 사항에 대한 피드백을 남겨 주세요. 자습서와 직접 관련이 없는 질문이 있는 경우 ASP.NET SignalR 포럼 또는 StackOverflow.com 게시할 수 있습니다.

추적을 사용하도록 설정하면 SignalR 애플리케이션이 이벤트에 대한 로그 항목을 만듭니다. 클라이언트와 서버 모두에서 이벤트를 기록할 수 있습니다. 서버에서 추적하면 연결, 스케일 아웃 공급자 및 메시지 버스 이벤트가 기록됩니다. 클라이언트에서 추적은 연결 이벤트를 기록합니다. SignalR 2.1 이상에서 클라이언트 추적은 허브 호출 메시지의 전체 콘텐츠를 기록합니다.

콘텐츠

서버에서 추적 사용

애플리케이션의 구성 파일(프로젝트 형식에 따라 App.config 또는 Web.config) 내의 서버에서 추적을 사용하도록 설정합니다. 기록할 이벤트의 범주를 지정합니다. 구성 파일에서 TraceListener 구현을 사용하여 이벤트를 텍스트 파일, Windows 이벤트 로그 또는 사용자 지정 로그에 기록할지 여부도 지정합니다.

서버 이벤트 범주에는 다음과 같은 종류의 메시지가 포함됩니다.

원본 메시지
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 로그를 보여 주는 이벤트 뷰어

참고

이벤트 로그를 사용하는 경우 TraceLevel오류 로 설정하여 메시지 수를 관리 가능한 상태로 유지합니다.

.NET 클라이언트에서 추적 사용(Windows 데스크톱 앱)

.NET 클라이언트는 TextWriter 구현을 사용하여 콘솔, 텍스트 파일 또는 사용자 지정 로그에 이벤트를 기록할 수 있습니다.

.NET 클라이언트에서 로깅을 사용하도록 설정하려면 연결의 TraceLevel 속성을 TraceLevelsTraceWriter 으로 설정하고 속성을 유효한 TextWriter instance 설정합니다.

콘솔에 데스크톱 클라이언트 이벤트 로깅

다음 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 의 사용자 지정 구현을 만들어야 합니다.

UI에 Windows Phone 클라이언트 이벤트 로깅

SignalR 코드베이스에는 라는 사용자 지정 TextWriter 구현을 사용하여 TextBlock에 추적 출력을 쓰는 Windows Phone 샘플이 TextBlockWriter포함되어 있습니다. 이 클래스는 samples/Microsoft.AspNet.SignalR.Client.WP8.Samples 프로젝트에서 찾을 수 있습니다. 의 TextBlockWriterinstance 만들 때 현재 SynchronizationContext 및 추적 출력에 사용할 TextBlock을 만드는 StackPanel을 전달합니다.

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 추적 이벤트