SignalR 추적 사용Enabling SignalR Tracing

만든 사람 Tom FitzMackenby Tom FitzMacken

Warning

이 설명서는 최신 버전의 SignalR에는 적합 하지 않습니다.This documentation isn't for the latest version of SignalR. ASP.NET Core SignalR를 살펴보세요.Take a look at ASP.NET Core SignalR.

이 문서에서는 SignalR 서버 및 클라이언트에 대 한 추적을 사용 하도록 설정 하 고 구성 하는 방법을 설명 합니다.This document describes how to enable and configure tracing for SignalR servers and clients. 추적을 사용 하면 SignalR 응용 프로그램에서 이벤트에 대 한 진단 정보를 볼 수 있습니다.Tracing enables you to view diagnostic information about events in your SignalR application.

이 항목은 원래 Patrick Fletcher에 의해 작성 되었습니다.This topic was originally written by Patrick Fletcher.

자습서에서 사용 되는 소프트웨어 버전Software versions used in the tutorial

질문 및 설명Questions and comments

이 자습서와 페이지 맨 아래에 있는 의견에서 개선할 수 있는 방법에 대 한 의견을 남겨 주세요.Please leave feedback on how you liked this tutorial and what we could improve in the comments at the bottom of the page. 자습서와 직접 관련 되지 않은 질문이 있는 경우 ASP.NET SignalR 포럼 또는 StackOverflow.com에 게시할 수 있습니다.If you have questions that are not directly related to the tutorial, you can post them to the ASP.NET SignalR forum or StackOverflow.com.

추적을 사용 하는 경우 SignalR 응용 프로그램에서 이벤트에 대 한 로그 항목을 만듭니다.When tracing is enabled, a SignalR application creates log entries for events. 클라이언트와 서버 모두에서 이벤트를 기록할 수 있습니다.You can log events from both the client and the server. 서버에 대 한 추적은 연결, 확장 공급자 및 메시지 버스 이벤트를 로깅합니다.Tracing on the server logs connection, scaleout provider, and message bus events. 클라이언트의 추적은 연결 이벤트를 기록 합니다.Tracing on the client logs connection events. SignalR 2.1 이상에서 클라이언트에 대 한 추적은 허브 호출 메시지의 전체 콘텐츠를 기록 합니다.In SignalR 2.1 and later, tracing on the client logs the full content of hub invocation messages.

콘텐츠Contents

서버에서 추적 사용Enabling tracing on the server

응용 프로그램의 구성 파일 (프로젝트의 형식에 따라 app.config 또는 web.config) 내의 서버에서 추적을 사용 하도록 설정 합니다. 로깅할 이벤트 범주를 지정 합니다.You enable tracing on the server within the application's configuration file (either App.config or Web.config depending on the type of project.) You specify which categories of events you want to log. 구성 파일에서 TraceListener의 구현을 사용 하 여 텍스트 파일, Windows 이벤트 로그 또는 사용자 지정 로그에 이벤트를 기록할지 여부도 지정 합니다.In the configuration file, you also specify whether to log the events to a text file, the Windows event log, or a custom log using an implementation of TraceListener.

서버 이벤트 범주는 다음과 같은 종류의 메시지를 포함 합니다.The server event categories include the following sorts of messages:

원본Source 메시지Messages
SignalR.SqlMessageBusSignalR.SqlMessageBus SQL 메시지 버스 확장 공급자 설치, 데이터베이스 작업, 오류 및 시간 제한 이벤트SQL Message Bus scaleout provider setup, database operation, error, and timeout events
SignalR.ServiceBusMessageBusSignalR.ServiceBusMessageBus Service bus 확장 공급자 토픽 만들기 및 구독, 오류 및 메시징 이벤트Service bus scaleout provider topic creation and subscription, error, and messaging events
SignalR.RedisMessageBusSignalR.RedisMessageBus Redis 확장 공급자 연결, 연결 끊기 및 오류 이벤트Redis scaleout provider connection, disconnection, and error events
SignalR.ScaleoutMessageBusSignalR.ScaleoutMessageBus 확장 messaging 이벤트Scaleout messaging events
SignalR.Transports.WebSocketTransportSignalR.Transports.WebSocketTransport WebSocket 전송 연결, 연결 끊기, 메시징 및 오류 이벤트WebSocket transport connection, disconnection, messaging, and error events
SignalR.Transports.ServerSentEventsTransportSignalR.Transports.ServerSentEventsTransport ServerSentEvents 전송 연결, 연결 끊기, 메시징 및 오류 이벤트ServerSentEvents transport connection, disconnection, messaging, and error events
SignalR.Transports.ForeverFrameTransportSignalR.Transports.ForeverFrameTransport ForeverFrame 전송 연결, 연결 끊기, 메시징 및 오류 이벤트ForeverFrame transport connection, disconnection, messaging, and error events
SignalR.Transports.LongPollingTransportSignalR.Transports.LongPollingTransport 이상 폴링 전송 연결, 연결 끊기, 메시징 및 오류 이벤트LongPolling transport connection, disconnection, messaging, and error events
SignalR.Transports.TransportHeartBeatSignalR.Transports.TransportHeartBeat 전송 연결, 연결 끊기 및 keepalive 이벤트Transport connection, disconnection, and keepalive events
SignalR.ReflectedHubDescriptorProviderSignalR.ReflectedHubDescriptorProvider 허브 검색 이벤트Hub discovery events

텍스트 파일에 서버 이벤트 로깅Logging server events to text files

다음 코드에서는 각 이벤트 범주에 대해 추적을 사용 하도록 설정 하는 방법을 보여 줍니다.The following code shows how to enable tracing for each category of event. 이 샘플에서는 텍스트 파일에 이벤트를 기록 하도록 응용 프로그램을 구성 합니다.This sample configures the application to log events to text files.

추적 사용을 위한 XML 서버 코드XML server code for enabling tracing

<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 를 지정 합니다.In the code above, the SignalRSwitch entry specifies the TraceLevel used for events sent to the specified log. 이 경우 모든 디버깅 및 추적 메시지가 기록 됨을 의미 하는 Verbose로 설정 됩니다.In this case, it is set to Verbose which means all debugging and tracing messages are logged.

다음 출력은 위의 구성 파일을 사용 하는 응용 프로그램에 대 한 transports.log.txt 파일의 항목을 보여 줍니다.The following output shows entries from the transports.log.txt file for an application using the above configuration file. 새 연결, 제거 된 연결 및 전송 하트 비트 이벤트를 표시 합니다.It shows a new connection, a removed connection, and transport heartbeat events.

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)

이벤트 로그에 서버 이벤트 로깅Logging server events to the event log

텍스트 파일이 아닌 이벤트 로그에 이벤트를 기록 하려면 sharedListeners 노드의 항목에 대 한 값을 변경 합니다.To log events to the event log rather than a text file, change the values for the entries in the sharedListeners node. 다음 코드에서는 이벤트 로그에 서버 이벤트를 기록 하는 방법을 보여 줍니다.The following code shows how to log server events to the event log:

이벤트 로그에 이벤트를 기록 하기 위한 XML 서버 코드XML server code for logging events to the event log

<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>

이벤트는 응용 프로그램 로그에 기록 되 고 아래와 같이 이벤트 뷰어를 통해 사용할 수 있습니다.The events are logged in the Application log, and are available through the Event Viewer, as shown below:

SignalR 로그를 보여 주는 이벤트 뷰어

Note

이벤트 로그를 사용 하는 경우 TraceLevelError 로 설정 하 여 메시지 수를 관리 가능 하 게 유지 합니다.When using the event log, set the TraceLevel to Error to keep the number of messages manageable.

.NET 클라이언트에서 추적 사용 (Windows 데스크톱 응용 프로그램)Enabling tracing in the .NET client (Windows Desktop apps)

.NET 클라이언트는 TextWriter의 구현을 사용 하 여 콘솔, 텍스트 파일 또는 사용자 지정 로그에 이벤트를 기록할 수 있습니다.The .NET client can log events to the console, a text file, or to a custom log using an implementation of TextWriter.

.NET 클라이언트에서 로깅을 사용 하도록 설정 하려면 연결의 TraceLevel 속성을 TraceLevels 값으로 설정 하 고 TraceWriter 속성을 올바른 TextWriter 인스턴스로 설정 합니다.To enable logging in the .NET client, set the connection's TraceLevel property to a TraceLevels value, and the TraceWriter property to a valid TextWriter instance.

데스크톱 클라이언트 이벤트를 콘솔에 기록Logging Desktop client events to the console

다음 C# 코드에서는 .net 클라이언트의 이벤트를 콘솔에 기록 하는 방법을 보여 줍니다.The following C# code shows how to log events in the .NET client to the console:

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();

텍스트 파일에 데스크톱 클라이언트 이벤트 로깅Logging Desktop client events to a text file

다음 C# 코드에서는 .net 클라이언트의 이벤트를 텍스트 파일에 기록 하는 방법을 보여 줍니다.The following C# code shows how to log events in the .NET client to a text file:

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 파일의 항목을 보여 줍니다.The following output shows entries from the ClientLog.txt file for an application using the above configuration file. 서버에 연결 하는 클라이언트와 addMessage이라는 클라이언트 메서드를 호출 하는 허브를 표시 합니다.It shows the client connecting to the server, and the hub invoking a client method called 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 클라이언트에서 추적 사용Enabling tracing in Windows Phone 8 clients

Windows Phone apps 용 SignalR 응용 프로그램은 데스크톱 앱과 동일한 .NET 클라이언트를 사용 하지만 콘솔 을 사용 하 고 StreamWriter 를 사용 하 여 파일에 쓰는 것은 사용할 수 없습니다.SignalR applications for Windows Phone apps use the same .NET client as desktop apps, but Console.Out and writing to a file with StreamWriter are not available. 대신, 추적을 위해 TextWriter 의 사용자 지정 구현을 만들어야 합니다.Instead, you need to create a custom implementation of TextWriter for tracing.

UI에 Windows Phone 클라이언트 이벤트 로깅Logging Windows Phone client events to the UI

SignalR 코드 베이스 에는 TextBlockWriter이라는 사용자 지정 TextWriter 구현을 사용 하 여 TextBlock 에 추적 출력을 기록 하는 Windows Phone 샘플이 포함 되어 있습니다.The SignalR codebase includes a Windows Phone sample that writes trace output to a TextBlock using a custom TextWriter implementation called TextBlockWriter. 이 클래스는 samples/SignalR. WP8 프로젝트에서 찾을 수 있습니다.This class can be found in the samples/Microsoft.AspNet.SignalR.Client.WP8.Samples project. TextBlockWriter인스턴스를 만들 때 현재 SynchronizationContext를 전달 하 고 추적 출력에 사용할 TextBlock 을 만들 StackPanel 을 전달 합니다.When creating an instance of TextBlockWriter, pass in the current SynchronizationContext, and a StackPanel where it will create a TextBlock to use for trace output:

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

그러면 전달 된 StackPanel 에서 만든 새 TextBlock 에 추적 출력이 기록 됩니다.The trace output will then be written to a new TextBlock created in the StackPanel you passed in:

디버그 콘솔에 Windows Phone 클라이언트 이벤트 로깅Logging Windows Phone client events to the debug console

출력을 UI 대신 디버그 콘솔로 보내려면 디버그 창에 쓰는 TextWriter 의 구현을 만들고 연결의 tracewriter 속성에 할당 합니다.To send output to the debug console rather than the UI, create an implementation of TextWriter that writes to the debug window, and assign it to your connection's TraceWriter property:

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의 디버그 창에 추적 정보가 기록 됩니다.Trace information will then be written to the debug window in Visual Studio:

JavaScript 클라이언트에서 추적 사용Enabling tracing in the JavaScript client

연결에 대 한 클라이언트 쪽 로깅을 사용 하도록 설정 하려면 연결 개체에 대 한 logging 속성을 설정 하 여 연결을 설정 하기 전에 start 메서드를 호출 합니다.To enable client-side logging on a connection, set the logging property on the connection object before you call the start method to establish the connection.

생성 된 프록시를 사용 하 여 브라우저 콘솔에 추적을 사용 하도록 설정 하는 클라이언트 JavaScript 코드Client JavaScript code for enabling tracing to the browser console (with the generated proxy)

$.connection.hub.logging = true;
$.connection.hub.start();

브라우저 콘솔에 대 한 추적을 사용 하도록 설정 하는 클라이언트 JavaScript 코드 (생성 된 프록시 제외)Client JavaScript code for enabling tracing to the browser console (without the generated proxy)

var connection = $.hubConnection();
connection.logging = true;
connection.start();

추적을 사용 하는 경우 JavaScript 클라이언트는 브라우저 콘솔에 이벤트를 기록 합니다.When tracing is enabled, the JavaScript client logs events to the browser console. 브라우저 콘솔에 액세스 하려면 전송 모니터링을 참조 하세요.To access the browser console, see Monitoring Transports.

다음 스크린샷에서는 추적을 사용 하는 SignalR JavaScript 클라이언트를 보여 줍니다.The following screenshot shows a SignalR JavaScript client with tracing enabled. 브라우저 콘솔에 연결 및 허브 호출 이벤트를 표시 합니다.It shows connection and hub invocation events in the browser console:

브라우저 콘솔의 SignalR 추적 이벤트