작성자: Andrew Stanton-Nurse
이 문서에서는 문제 해결을 위해 ASP.NET Core SignalR 앱에서 진단 정보를 수집하는 방법에 대한 지침을 제공합니다.
서버 쪽 로깅
경고
서버 쪽 로그에는 앱의 중요한 정보가 포함될 수 있습니다. 프로덕션 앱의 원시 로그를 GitHub와 같은 퍼블릭 포럼에 게시하면 안 됩니다.
SignalR은 ASP.NET Core의 일부이므로 ASP.NET Core 로깅 시스템을 사용합니다. 기본 구성 SignalR 에서 최소 정보를 기록하지만 로깅 수준을 구성할 수 있습니다. ASP.NET Core 로깅을 구성하는 방법에 대한 자세한 내용은 ASP.NET Core 로깅 문서를 참조하세요.
SignalR에서는 두 개의 로거 범주를 사용합니다.
-
Microsoft.AspNetCore.SignalR
: 허브 프로토콜과 관련된 로그, 허브 활성화, 메서드 호출 및 기타 허브 관련 작업 -
Microsoft.AspNetCore.Http.Connections
: WebSocket, 긴 폴링, Server-Sent 이벤트, 하위 수준 SignalR 인프라 등의 전송과 관련된 로그
자세한 로그를 활성화하려면, SignalR에서 이전에 언급한 두 접두사를 Debug
수준으로 설정해야 합니다. 이를 위해 appsettings.json
의 LogLevel
하위 섹션에 다음 항목을 Logging
파일에 추가하세요.
{
"Logging": {
"LogLevel": {
"Default": "Debug",
"System": "Information",
"Microsoft": "Information",
"Microsoft.AspNetCore.SignalR": "Debug",
"Microsoft.AspNetCore.Http.Connections": "Debug"
}
}
}
SignalR 로거 범주의 로깅 수준은 CreateWebHostBuilder
메서드 내 코드에서도 구성할 수 있습니다.
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.ConfigureLogging(logging =>
{
logging.AddFilter("Microsoft.AspNetCore.SignalR", LogLevel.Debug);
logging.AddFilter("Microsoft.AspNetCore.Http.Connections", LogLevel.Debug);
})
.UseStartup<Startup>();
JSON 기반 구성을 사용하지 않는 경우 구성 시스템에서 다음 구성 값을 설정합니다.
Logging:LogLevel:Microsoft.AspNetCore.SignalR
=Debug
Logging:LogLevel:Microsoft.AspNetCore.Http.Connections
=Debug
구성 시스템 설명서에서 중첩된 구성 값을 지정하는 방법을 확인합니다. 예를 들어 환경 변수를 사용하는 경우, _
대신 두 개의 :
문자가 사용됩니다(예: Logging__LogLevel__Microsoft.AspNetCore.SignalR
).
앱에 대한 자세한 진단을 수집하는 경우 Debug
수준을 사용하는 것이 좋습니다. 이 Trace
수준은 낮은 수준의 진단을 생성하며 앱에서 문제를 진단하는 데 거의 필요하지 않습니다.
서버 쪽 로그 액세스
서버 쪽 로그에 액세스하는 방법은 앱이 실행되는 환경에 따라 달라집니다.
IIS 외부의 콘솔 앱으로
콘솔 앱에서 실행하는 경우 콘솔 로거가 기본적으로 사용되어야 합니다. SignalR 로그가 콘솔에 표시됩니다.
Visual Studio에서 IIS Express 내
Visual Studio는 출력 창에 로그 출력을 표시합니다. ASP.NET Core 웹 서버 드롭다운 옵션을 선택합니다.
Azure App Service
Azure App Service 포털의 진단 로그 섹션에서 애플리케이션 로깅(파일 시스템) 옵션을 활성화하고 수준을 Verbose
로 구성합니다. 로그는 로그 스트리밍 서비스와 App Service 파일 시스템의 로그에서 사용할 수 있어야 합니다. 자세한 내용은 Azure 로그 스트리밍을 참조하세요.
기타 환경
Docker, Kubernetes 또는 Windows 서비스와 같은 다양한 배포 환경에 적합한 로깅 공급자를 구성하는 방법에 대한 자세한 내용은 .NET Core 및 ASP.NET Core의 로깅을 참조하세요.
JavaScript 클라이언트 로깅
경고
클라이언트 쪽 로그에는 앱의 중요한 정보가 포함될 수 있습니다. 프로덕션 앱의 원시 로그를 GitHub와 같은 퍼블릭 포럼에 게시하면 안 됩니다.
JavaScript 클라이언트를 사용하는 경우 configureLogging
의 HubConnectionBuilder
메서드를 사용하여 로깅 옵션을 구성할 수 있습니다.
let connection = new signalR.HubConnectionBuilder()
.withUrl("/my/hub/url")
.configureLogging(signalR.LogLevel.Debug)
.build();
메서드의 signalR.LogLevel.None
에 configureLogging
을(를) 지정하여 프레임워크 로깅을 비활성화합니다. 일부 로깅은 브라우저에서 직접 내보내며 로그 수준을 설정하여 사용하지 않도록 설정할 수 없습니다.
다음 표에서는 JavaScript 클라이언트에서 사용할 수 있는 로그 수준을 보여 줍니다. 로그 수준을 이러한 값 중 하나로 설정하면 해당 수준 및 테이블 위의 모든 수준에서 로깅을 활성화할 수 있습니다.
수준 | 설명 |
---|---|
None |
메시지가 기록되지 않습니다. |
Critical |
전체 앱에서 실패를 나타내는 메시지입니다. |
Error |
현재 작업에서 실패를 나타내는 메시지입니다. |
Warning |
심각하지 않은 문제를 나타내는 메시지입니다. |
Information |
알림 메시지 |
Debug |
디버깅에 유용한 진단 메시지입니다. |
Trace |
특정 문제를 진단하기 위해 설계된 매우 자세한 진단 메시지입니다. |
세부 정보 표시를 구성하면 로그가 브라우저 콘솔에 기록되거나 NodeJS 앱의 표준 출력에 기록 됩니다.
로그를 사용자 지정 로깅 시스템으로 전송하려는 경우 ILogger
인터페이스를 구현하는 JavaScript 개체를 제공할 수 있습니다. 구현해야 하는 유일한 방법은 이벤트의 수준 및 이벤트와 연결된 메시지를 가져오는 log
입니다. 예시:
import { ILogger, LogLevel, HubConnectionBuilder } from "@microsoft/signalr";
export class MyLogger implements ILogger {
log(logLevel: LogLevel, message: string) {
// Use `message` and `logLevel` to record the log message to your own system
}
}
// later on, when configuring your connection...
let connection = new HubConnectionBuilder()
.withUrl("/my/hub/url")
.configureLogging(new MyLogger())
.build();
import { ILogger, LogLevel, HubConnectionBuilder } from "@aspnet/signalr";
export class MyLogger implements ILogger {
log(logLevel: LogLevel, message: string) {
// Use `message` and `logLevel` to record the log message to your own system
}
}
// later on, when configuring your connection...
let connection = new HubConnectionBuilder()
.withUrl("/my/hub/url")
.configureLogging(new MyLogger())
.build();
.NET 클라이언트 로깅
경고
클라이언트 쪽 로그에는 앱의 중요한 정보가 포함될 수 있습니다. 프로덕션 앱의 원시 로그를 GitHub와 같은 퍼블릭 포럼에 게시하면 안 됩니다.
.NET 클라이언트에서 로그를 가져오기 위해 ConfigureLogging
의 HubConnectionBuilder
메서드를 사용할 수 있습니다. 이는 ConfigureLogging
및 WebHostBuilder
에서 HostBuilder
메서드와 동일한 방식으로 작동합니다. ASP.NET Core에서 사용하는 것과 동일한 로깅 공급자를 구성할 수 있습니다. 그러나 개별 로깅 공급자에 대한 NuGet 패키지를 수동으로 설치하고 활성화해야 합니다.
Blazor WebAssembly 앱에 .NET 클라이언트 로깅을 추가하려면 ASP.NET Core Blazor 로깅을 참조하세요.
콘솔 로깅
콘솔 로깅을 활성화하려면 Microsoft.Extensions.Logging.Console 패키지를 추가합니다. 그런 다음, AddConsole
메서드를 사용하여 콘솔 로거를 구성합니다.
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/my/hub/url")
.ConfigureLogging(logging =>
{
// Log to the Console
logging.AddConsole();
// This will set ALL logging to Debug level
logging.SetMinimumLevel(LogLevel.Debug);
})
.Build();
출력 창 로깅 디버그
Visual Studio의 출력 창으로 이동하도록 로그를 구성할 수 있습니다.
Microsoft.Extensions.Logging.Debug 패키지를 설치하고 AddDebug
메서드를 사용합니다.
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/my/hub/url")
.ConfigureLogging(logging =>
{
// Log to the Output Window
logging.AddDebug();
// This will set ALL logging to Debug level
logging.SetMinimumLevel(LogLevel.Debug)
})
.Build();
기타 로깅 공급자
SignalR은 Serilog, Seq, NLog 또는 Microsoft.Extensions.Logging
과 통합되는 기타 로깅 시스템과 같은 기타 로깅 공급자를 지원합니다. 로깅 시스템에서 ILoggerProvider
를 제공하는 경우 AddProvider
를 사용하여 등록할 수 있습니다.
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/my/hub/url")
.ConfigureLogging(logging =>
{
// Log to your custom provider
logging.AddProvider(new MyCustomLoggingProvider());
// This will set ALL logging to Debug level
logging.SetMinimumLevel(LogLevel.Debug)
})
.Build();
컨트롤 세부 정보 표시
앱의 다른 위치에서 로깅하는 경우, 기본 로그 수준을 Debug
로 변경하는 것이 너무 상세할 수 있습니다. 필터를 사용하여 로그에 대한 SignalR 로깅 수준을 구성할 수 있습니다. 이 작업은 서버에서와 거의 동일한 방식으로 코드에서 수행할 수 있습니다.
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/my/hub/url")
.ConfigureLogging(logging =>
{
// Register your providers
// Set the default log level to Information, but to Debug for SignalR-related loggers.
logging.SetMinimumLevel(LogLevel.Information);
logging.AddFilter("Microsoft.AspNetCore.SignalR", LogLevel.Debug);
logging.AddFilter("Microsoft.AspNetCore.Http.Connections", LogLevel.Debug);
})
.Build();
추적 중 SignalR
SignalR 허브 서버와 SignalR 클라이언트는 SignalR 연결 및 메시지에 대한 정보를 DiagnosticSource 및 Activity을 사용하여 제공합니다. SignalR 에는 .NET 9부터 사용할 수 있는 허브 서버와 클라이언트 모두에 대한 ActivitySource가 있습니다.
ActivitySource는 애플리케이션의 작업을 나타내는 활동(또는 범위)을 만들고 관리하기 위해 분산 추적에 사용되는 구성 요소입니다. 이러한 활동을 사용하여 다음을 수행할 수 있습니다.
- 다양한 구성 요소 및 서비스에서 요청 및 작업의 흐름을 추적합니다.
- 애플리케이션의 성능 및 동작에 대한 중요한 인사이트를 제공합니다.
.NET SignalR 서버의 ActivitySource
SignalR라는 이름의 Microsoft.AspNetCore.SignalR.Server
ActivitySource는 허브 메서드 호출에 대한 이벤트를 내보냅니다.
- 모든 메서드는 자체 작업이므로 허브 메서드 호출 중에 활동을 내보내는 모든 작업은 허브 메서드 작업 아래에 있습니다.
- 허브 메서드 활동에는 부모가 없습니다. 즉, 장기 실행 SignalR 연결에 포함되지 않습니다.
다음 예제에서는 .NET Aspire 대시보드 및 OpenTelemetry 패키지를 사용합니다.
<PackageReference Include="OpenTelemetry.Exporter.OpenTelemetryProtocol" Version="1.9.0" />
<PackageReference Include="OpenTelemetry.Extensions.Hosting" Version="1.9.0" />
<PackageReference Include="OpenTelemetry.Instrumentation.AspNetCore" Version="1.9.0" />
파일에 다음 시작 코드를 추가합니다 Program.cs
.
using OpenTelemetry.Trace;
using SignalRChat.Hubs;
// Set OTEL_EXPORTER_OTLP_ENDPOINT environment variable depending on where your OTEL endpoint is.
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorPages();
builder.Services.AddSignalR();
builder.Services.AddOpenTelemetry()
.WithTracing(tracing =>
{
if (builder.Environment.IsDevelopment())
{
// View all traces only in development environment.
tracing.SetSampler(new AlwaysOnSampler());
}
tracing.AddAspNetCoreInstrumentation();
tracing.AddSource("Microsoft.AspNetCore.SignalR.Server");
});
builder.Services.ConfigureOpenTelemetryTracerProvider(tracing => tracing.AddOtlpExporter());
var app = builder.Build();
다음 예제 출력은 Aspire 대시보드의 출력입니다.
ASP.NET Core는 이벤트 원본에 Microsoft.AspNetCore.Hosting
대한 자체 메트릭도 제공합니다.
.NET SignalR 클라이언트 ActivitySource
SignalR
ActivitySource
Microsoft.AspNetCore.SignalR.Client
로 명명된 SignalR 클라이언트에 대한 이벤트를 내보냅니다.
- 허브 호출은 클라이언트 범위를 만듭니다. JavaScript 클라이언트와 같은 다른 SignalR 클라이언트는 추적을 지원하지 않습니다. 이 기능은 향후 릴리스에서 더 많은 클라이언트에 추가될 예정입니다.
- 클라이언트와 서버에서의 허브 호출은 컨텍스트 전파을 지원합니다. 추적 컨텍스트를 전파하면 실제 분산 추적이 가능합니다. 이제 호출이 클라이언트에서 서버로, 그리고 다시 이동하는 것을 볼 수 있습니다.
.NET Aspire 대시보드에서는 이러한 새로운 활동들이 다음과 같이 표시됩니다:
네트워크 추적
경고
네트워크 추적에는 앱에서 보낸 모든 메시지의 전체 콘텐츠가 포함됩니다. 프로덕션 앱의 원시 네트워크 추적을 GitHub와 같은 공개 포럼에 게시하면 안 됩니다.
문제가 발생하면 네트워크 추적에서 중요한 정보를 제공할 수 있습니다. 이는 문제 추적기에서 문제를 제출할 때 특히 유용합니다.
Fiddler를 사용하여 네트워크 추적 수집(기본 설정 옵션)
이 방법은 모든 앱에 사용할 수 있습니다.
Fiddler는 HTTP 추적을 수집하는 데 사용되는 강력한 도구입니다. telerik.com/fiddler에서 설치하고 시작한 다음, 앱을 실행하고 문제를 재현합니다. Fiddler는 Windows에 사용할 수 있으며 macOS 및 Linux에 대한 베타 버전이 있습니다.
HTTPS를 사용하여 연결하는 경우 Fiddler에서 HTTPS 트래픽을 해독할 수 있는지 확인하기 위한 몇 가지 추가 단계가 있습니다. 자세한 내용은 Fiddler 설명서를 참조하세요.
메뉴 모음에서 파일>저장>모든 세션을 선택하여 추적을 내보냅니다.
tcpdump를 사용하여 네트워크 추적 수집(macOS 및 Linux에만 해당)
이 방법은 모든 앱에 사용할 수 있습니다.
명령 셸에서 다음 명령을 실행하여 tcpdump를 사용하여 원시 TCP 추적을 수집할 수 있습니다. 사용 권한 오류가 발생하는 경우 root
이거나 명령에 sudo
접두사를 사용해야 할 수 있습니다.
tcpdump -i [interface] -w trace.pcap
[interface]
를 캡처할 네트워크 인터페이스로 바꿉니다. 일반적으로 이것은 /dev/eth0
(표준 이더넷 인터페이스의 경우) 또는 /dev/lo0
(localhost 트래픽의 경우)와 같은 것입니다. 자세한 내용은 호스트 시스템의 수동 페이지를 참조 tcpdump
하세요.
브라우저에서 네트워크 추적 수집
이 메서드는 브라우저 기반 앱에서만 작동합니다.
대부분의 브라우저 개발자 도구 콘솔에는 브라우저와 서버 간에 네트워크 활동을 캡처할 수 있는 "네트워크" 탭이 있습니다. 그러나 이러한 추적에는 WebSocket 및 Server-Sent 이벤트 메시지가 포함되지 않습니다. 이러한 전송을 사용하는 경우 이 문서의 뒷부분에서 설명한 대로 Fiddler 또는 TcpDump와 같은 도구를 사용하는 것이 더 나은 방법입니다.
Microsoft Edge 및 Internet Explorer
(지침은 Microsoft Edge 및 Internet Explorer 모두에 대해 동일합니다.)
- F12 키를 눌러 개발 도구 열기
- 네트워크 탭 선택
- 페이지를 새로 고치고(필요한 경우) 문제 재현
- 도구 모음에서 저장 아이콘을 선택하여 추적을 "HAR" 파일로 내보냅니다.
구글 크롬
- F12 키를 눌러 개발 도구 열기
- 네트워크 탭 선택
- 페이지를 새로 고치고(필요한 경우) 문제 재현
- 요청 목록의 아무 곳이나 마우스 오른쪽 단추로 클릭하고 "콘텐츠로 HAR로 저장"을 선택합니다.
모질라 파이어폭스
- F12 키를 눌러 개발 도구 열기
- 네트워크 탭 선택
- 페이지를 새로 고치고(필요한 경우) 문제 재현
- 요청 목록의 아무 곳이나 마우스 오른쪽 단추로 클릭하고 "HAR로 모두 저장" 선택
진단 파일을 GitHub 이슈에 연결
GitHub 문제에 진단 파일을 첨부하려면, 파일의 확장명을 .txt
로 변경한 후 문제에 끌어다 놓으십시오.
참고 항목
로그 파일 또는 네트워크 추적의 콘텐츠를 GitHub 이슈에 붙여넣지 마세요. 이러한 로그 및 추적은 클 수 있으며 GitHub이 일반적으로 잘라냅니다.
메트릭
메트릭은 시간 간격에 따른 데이터 측정값의 표현입니다. 예를 들어 초당 요청 수입니다. 메트릭 데이터를 통해 앱 상태를 상위 수준에서 관찰할 수 있습니다. EventCounter를 사용하여 .NET gRPC 메트릭을 내보냅니다.
SignalR 서버 메트릭
SignalR 서버 메트릭은 Microsoft.AspNetCore.Http.Connections 이벤트 원본에 보고됩니다.
속성 | 설명 |
---|---|
connections-started |
시작된 총 연결 수 |
connections-stopped |
중지된 총 연결 수 |
connections-timed-out |
시간 초과된 총 연결 수 |
current-connections |
현재 연결 |
connections-duration |
평균 연결 기간 |
메트릭 확인
dotnet-counters는 임시 상태 모니터링 및 1단계 수준 성능 조사를 위한 성능 모니터링 도구입니다. 공급자 이름이 Microsoft.AspNetCore.Http.Connections
인 .NET 앱을 모니터링합니다. 예시:
> dotnet-counters monitor --process-id 37016 --counters Microsoft.AspNetCore.Http.Connections
Press p to pause, r to resume, q to quit.
Status: Running
[Microsoft.AspNetCore.Http.Connections]
Average Connection Duration (ms) 16,040.56
Current Connections 1
Total Connections Started 8
Total Connections Stopped 7
Total Connections Timed Out 0
추가 리소스
ASP.NET Core