SignalR 추적 사용
경고
이 설명서는 최신 버전의 SignalR용이 아닙니다. ASP.NET Core SignalR을 살펴보세요.
이 문서에서는 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 이벤트 로그 또는 사용자 지정 로그에 기록할지 여부도 지정합니다.
서버 이벤트 범주에는 다음과 같은 종류의 메시지가 포함됩니다.
원본 | 메시지 |
---|---|
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>
이벤트는 애플리케이션 로그에 기록되며 아래와 같이 이벤트 뷰어 통해 사용할 수 있습니다.
참고
이벤트 로그를 사용하는 경우 TraceLevel 을 오류 로 설정하여 메시지 수를 관리 가능한 상태로 유지합니다.
.NET 클라이언트에서 추적 사용(Windows 데스크톱 앱)
.NET 클라이언트는 TextWriter 구현을 사용하여 콘솔, 텍스트 파일 또는 사용자 지정 로그에 이벤트를 기록할 수 있습니다.
.NET 클라이언트에서 로깅을 사용하도록 설정하려면 연결의 TraceLevel
속성을 TraceLevels 값 TraceWriter
으로 설정하고 속성을 유효한 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.Out 및 StreamWriter를 사용하여 파일에 쓰는 것은 사용할 수 없습니다. 대신 추적을 위해 TextWriter 의 사용자 지정 구현을 만들어야 합니다.
UI에 Windows Phone 클라이언트 이벤트 로깅
SignalR 코드베이스에는 라는 사용자 지정 TextWriter 구현을 사용하여 TextBlock에 추적 출력을 쓰는 Windows Phone 샘플이 TextBlockWriter
포함되어 있습니다. 이 클래스는 samples/Microsoft.AspNet.SignalR.Client.WP8.Samples 프로젝트에서 찾을 수 있습니다. 의 TextBlockWriter
instance 만들 때 현재 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 클라이언트 이벤트 로깅
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 클라이언트를 보여 줍니다. 브라우저 콘솔에서 연결 및 허브 호출 이벤트를 표시합니다.