ASP.NET Core SignalR에서 로깅 및 진단

작성자: Andrew Stanton-Nurse

이 문서에서는 문제 해결을 위해 ASP.NET Core SignalR 앱에서 진단 정보를 수집하는 방법에 대한 지침을 제공합니다.

서버 쪽 로깅

Warning

서버 쪽 로그에는 앱의 중요한 정보가 포함될 수 있습니다. 프로덕션 앱의 원시 로그를 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의 자세한 로그를 활성화하려면 LoggingLogLevel 하위 섹션에 다음 항목을 추가하여 appsettings.json 파일의 Debug 수준에 위의 두 접두사를 구성합니다.

{
    "Logging": {
        "LogLevel": {
            "Default": "Debug",
            "System": "Information",
            "Microsoft": "Information",
            "Microsoft.AspNetCore.SignalR": "Debug",
            "Microsoft.AspNetCore.Http.Connections": "Debug"
        }
    }
}

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 클라이언트 로깅

Warning

클라이언트 쪽 로그에는 앱의 중요한 정보가 포함될 수 있습니다. 프로덕션 앱의 원시 로그를 GitHub와 같은 퍼블릭 포럼에 게시하면 안 됩니다.

JavaScript 클라이언트를 사용하는 경우 HubConnectionBuilderconfigureLogging 메서드를 사용하여 로깅 옵션을 구성할 수 있습니다.

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/my/hub/url")
    .configureLogging(signalR.LogLevel.Debug)
    .build();

프레임워크 로깅을 사용하지 않도록 설정하려면 메서드를 지정 signalR.LogLevel.None 합니다 configureLogging . 일부 로깅은 브라우저에서 직접 내보내며 로그 수준을 설정하여 사용하지 않도록 설정할 수 없습니다.

다음 표에서는 JavaScript 클라이언트에서 사용할 수 있는 로그 수준을 보여 줍니다. 로그 수준을 이러한 값 중 하나로 설정하면 해당 수준 및 테이블 위의 모든 수준에서 로깅을 활성화할 수 있습니다.

Level 설명
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 클라이언트 로깅

Warning

클라이언트 쪽 로그에는 앱의 중요한 정보가 포함될 수 있습니다. 프로덕션 앱의 원시 로그를 GitHub와 같은 퍼블릭 포럼에 게시하면 안 됩니다.

.NET 클라이언트에서 로그를 가져오기 위해 HubConnectionBuilderConfigureLogging 메서드를 사용할 수 있습니다. 이는 WebHostBuilderHostBuilder에서 ConfigureLogging 메서드와 동일한 방식으로 작동합니다. 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();

네트워크 추적

Warning

네트워크 추적에는 앱에서 보낸 모든 메시지의 전체 콘텐츠가 포함됩니다. 프로덕션 앱에서 GitHub와 같은 공개 포럼에 원시 네트워크 추적을 게시하지 마세요 .

문제가 발생하는 경우 네트워크 추적이 많은 유용한 정보를 제공하는 경우가 있습니다. 문제 추적기에서 문제를 해결하려는 경우 특히 유용합니다.

Fiddler를 사용하여 네트워크 추적 수집(기본 설정 옵션)

이 방법은 모든 앱에 사용할 수 있습니다.

Fiddler는 HTTP 추적을 수집하는 매우 강력한 도구입니다. telerik.com/fiddler에서 설치하고 시작한 다음, 앱을 실행하고 문제를 재현합니다. Fiddler는 Windows에 사용할 수 있으며 macOS 및 Linux에 대한 베타 버전이 있습니다.

HTTPS를 사용하여 연결하는 경우 Fiddler에서 HTTPS 트래픽을 해독할 수 있는지 확인하기 위한 몇 가지 추가 단계가 있습니다. 자세한 내용은 Fiddler 설명서를 참조하세요.

추적을 수집한 후에는 메뉴 모음에서 모든 세션 저장>파일을>선택하여 추적을 내보낼 수 있습니다.

Exporting all sessions from Fiddler

tcpdump를 사용하여 네트워크 추적 수집(macOS 및 Linux만 해당)

이 방법은 모든 앱에 사용할 수 있습니다.

명령 셸에서 다음 명령을 실행하여 tcpdump를 사용하여 원시 TCP 추적을 수집할 수 있습니다. 사용 권한 오류가 발생할 경우 명령을 접두사로 sudo 지정하거나 접두사로 지정해야 할 root 수 있습니다.

tcpdump -i [interface] -w trace.pcap

캡처하려는 네트워크 인터페이스로 바꿉 [interface] 니다. 일반적으로 이는 /dev/eth0(표준 이더넷 인터페이스의 경우) 또는 /dev/lo0(localhost 트래픽의 경우)과 같은 항목입니다. 자세한 내용은 호스트 시스템의 맨 페이지를 참조 tcpdump 하세요.

브라우저에서 네트워크 추적 수집

이 메서드는 브라우저 기반 앱에서만 작동합니다.

대부분의 브라우저 개발자 도구 콘솔에는 브라우저와 서버 간의 네트워크 활동을 캡처할 수 있는 "네트워크" 탭이 있습니다. 그러나 이러한 추적에는 WebSocket 및 Server-Sent 이벤트 메시지가 포함되지 않습니다. 이러한 전송을 사용하는 경우 Fiddler 또는 TcpDump(아래 설명 참조)와 같은 도구를 사용하는 것이 더 나은 방법입니다.

Microsoft Edge 및 Internet Explorer

(지침은 Edge와 Internet Explorer 모두에 대해 동일합니다.)

  1. F12 키를 눌러 개발 도구 열기
  2. 네트워크 탭 클릭
  3. 필요한 경우 페이지를 새로 고치고 문제를 재현합니다.
  4. 도구 모음에서 저장 아이콘을 클릭하여 추적을 "HAR" 파일로 내보냅니다.

The Save Icon on the Microsoft Edge Dev Tools Network Tab

Google Chrome

  1. F12 키를 눌러 개발 도구 열기
  2. 네트워크 탭 클릭
  3. 필요한 경우 페이지를 새로 고치고 문제를 재현합니다.
  4. 요청 목록의 아무 곳이나 마우스 오른쪽 단추로 클릭하고 "콘텐츠로 HAR로 저장"을 선택합니다.

Mozilla Firefox

  1. F12 키를 눌러 개발 도구 열기
  2. 네트워크 탭 클릭
  3. 필요한 경우 페이지를 새로 고치고 문제를 재현합니다.
  4. 요청 목록의 아무 곳이나 마우스 오른쪽 단추로 클릭하고 "HAR로 모두 저장" 선택

진단 파일을 GitHub 이슈에 연결

.txt 확장명이 있도록 이름을 변경한 다음, 이슈에 끌어서 놓아 진단 파일을 GitHub 이슈에 연결할 수 있습니다.

참고 항목

로그 파일 또는 네트워크 추적의 콘텐츠를 GitHub 이슈에 붙여넣지 마세요. 이러한 로그 및 추적은 매우 클 수 있으며 일반적으로 GitHub는 이를 잘라냅니다.

Dragging log files on to a GitHub issue

메트릭

메트릭은 시간 간격에 따른 데이터 측정값의 표현입니다. 예를 들어 초당 요청 수입니다. 메트릭 데이터를 통해 앱 상태를 상위 수준에서 관찰할 수 있습니다. 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 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

추가 리소스