Rejestrowanie i diagnostyka w programie ASP.NET Core SignalR

Przez Andrew Stanton-Nurse

Ten artykuł zawiera wskazówki dotyczące zbierania danych diagnostycznych z aplikacji ASP.NET Core SignalR , które ułatwiają rozwiązywanie problemów.

Rejestrowanie po stronie serwera

Ostrzeżenie

Dzienniki po stronie serwera mogą zawierać poufne informacje z aplikacji. Nigdy nie publikuj nieprzetworzonych dzienników z aplikacji produkcyjnych na forach publicznych, takich jak GitHub.

Ponieważ SignalR jest częścią ASP.NET Core, używa systemu rejestrowania ASP.NET Core. W konfiguracji SignalR domyślnej rejestruje bardzo mało informacji, ale można to skonfigurować. Zapoznaj się z dokumentacją dotyczącą rejestrowania ASP.NET Core, aby uzyskać szczegółowe informacje na temat konfigurowania rejestrowania ASP.NET Core.

SignalR używa dwóch kategorii rejestratora:

  • Microsoft.AspNetCore.SignalR: w przypadku dzienników związanych z protokołami koncentratora aktywowanie centrów, wywoływanie metod i innych działań związanych z koncentratorem.
  • Microsoft.AspNetCore.Http.Connections: w przypadku dzienników związanych z transportami, takimi jak WebSockets, Long Polling, Server-Sent Events i infrastruktura niskiego poziomu SignalR .

Aby włączyć szczegółowe dzienniki z SignalRprogramu , skonfiguruj oba poprzednie prefiksy na Debug poziom w appsettings.json pliku, dodając następujące elementy do LogLevel podsekcji w pliku :Logging

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

Można to również skonfigurować w kodzie w metodzie 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>();

Jeśli nie używasz JSkonfiguracji opartej na protokole , ustaw następujące wartości konfiguracji w systemie konfiguracji:

  • Logging:LogLevel:Microsoft.AspNetCore.SignalR = Debug
  • Logging:LogLevel:Microsoft.AspNetCore.Http.Connections = Debug

Zapoznaj się z dokumentacją systemu konfiguracji, aby określić sposób określania wartości konfiguracji zagnieżdżonych. Na przykład w przypadku używania zmiennych środowiskowych używane są dwa _ znaki zamiast : (na przykład Logging__LogLevel__Microsoft.AspNetCore.SignalR).

Zalecamy użycie poziomu podczas zbierania Debug bardziej szczegółowej diagnostyki aplikacji. Poziom Trace generuje bardzo niską diagnostykę i rzadko jest potrzebny do diagnozowania problemów w aplikacji.

Uzyskiwanie dostępu do dzienników po stronie serwera

Sposób uzyskiwania dostępu do dzienników po stronie serwera zależy od środowiska, w którym działasz.

Jako aplikacja konsolowa poza usługami IIS

Jeśli korzystasz z aplikacji konsolowej, rejestrator konsoli powinien być domyślnie włączony. SignalR dzienniki będą wyświetlane w konsoli programu .

W programie IIS Express z programu Visual Studio

Program Visual Studio wyświetla dane wyjściowe dziennika w oknie Dane wyjściowe . Wybierz opcję listy rozwijanej ASP.NET Podstawowy serwer sieci Web.

Azure App Service

Włącz opcję Rejestrowanie aplikacji (system plików) w sekcji Dzienniki diagnostyczne w portalu usługi aplikacja systemu Azure i skonfiguruj poziom na Verbose. Dzienniki powinny być dostępne w usłudze przesyłania strumieniowego dzienników i w dziennikach w systemie plików usługi App Service. Aby uzyskać więcej informacji, zobacz Przesyłanie strumieniowe dzienników platformy Azure.

Inne środowiska

Jeśli aplikacja jest wdrażana w innym środowisku (na przykład Docker, Kubernetes lub Windows Service), zobacz Rejestrowanie na platformie .NET Core i ASP.NET Core , aby uzyskać więcej informacji na temat konfigurowania dostawców rejestrowania odpowiednich dla środowiska.

Rejestrowanie klienta w języku JavaScript

Ostrzeżenie

Dzienniki po stronie klienta mogą zawierać poufne informacje z aplikacji. Nigdy nie publikuj nieprzetworzonych dzienników z aplikacji produkcyjnych na forach publicznych, takich jak GitHub.

W przypadku korzystania z klienta JavaScript można skonfigurować opcje rejestrowania configureLogging przy użyciu metody w pliku HubConnectionBuilder:

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

Aby wyłączyć rejestrowanie platformy, określ signalR.LogLevel.None w metodzie configureLogging . Należy pamiętać, że niektóre rejestrowanie jest emitowane bezpośrednio przez przeglądarkę i nie można ich wyłączyć za pomocą ustawienia poziomu dziennika.

W poniższej tabeli przedstawiono poziomy dzienników dostępne dla klienta JavaScript. Ustawienie poziomu dziennika na jedną z tych wartości umożliwia rejestrowanie na tym poziomie i na wszystkich poziomach powyżej w tabeli.

Poziom opis
None Żadne komunikaty nie są rejestrowane.
Critical Komunikaty wskazujące błąd w całej aplikacji.
Error Komunikaty wskazujące błąd w bieżącej operacji.
Warning Komunikaty wskazujące niekrytyczny problem.
Information Komunikaty informacyjne.
Debug Komunikaty diagnostyczne przydatne do debugowania.
Trace Bardzo szczegółowe komunikaty diagnostyczne przeznaczone do diagnozowania określonych problemów.

Po skonfigurowaniu szczegółowości dzienniki zostaną zapisane w konsoli przeglądarki (lub standardowe dane wyjściowe w aplikacji NodeJS ).

Jeśli chcesz wysyłać dzienniki do niestandardowego systemu rejestrowania, możesz udostępnić obiekt JavaScript implementujący ILogger interfejs. Jedyną metodą, która musi zostać zaimplementowana, jest log, która przyjmuje poziom zdarzenia i komunikat skojarzony ze zdarzeniem. Przykład:

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

Rejestrowanie klienta platformy .NET

Ostrzeżenie

Dzienniki po stronie klienta mogą zawierać poufne informacje z aplikacji. Nigdy nie publikuj nieprzetworzonych dzienników z aplikacji produkcyjnych na forach publicznych, takich jak GitHub.

Aby pobrać dzienniki z klienta platformy .NET, możesz użyć ConfigureLogging metody w pliku HubConnectionBuilder. Działa to w taki sam sposób, jak ConfigureLogging metoda on WebHostBuilder i HostBuilder. Możesz skonfigurować tych samych dostawców rejestrowania, których używasz w programie ASP.NET Core. Należy jednak ręcznie zainstalować i włączyć pakiety NuGet dla poszczególnych dostawców rejestrowania.

Aby dodać rejestrowanie klienta platformy .NET do Blazor WebAssembly aplikacji, zobacz rejestrowanie ASP.NET CoreBlazor.

Rejestrowanie konsoli

Aby włączyć rejestrowanie konsoli, dodaj pakiet Microsoft.Extensions.Logging.Console . Następnie użyj AddConsole metody , aby skonfigurować rejestrator konsoli:

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

Debugowanie rejestrowania okna danych wyjściowych

Dzienniki można również skonfigurować, aby przejść do okna Dane wyjściowe w programie Visual Studio. Zainstaluj pakiet Microsoft.Extensions.Logging.Debug i użyj AddDebug metody :

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

Inni dostawcy rejestrowania

SignalR obsługuje innych dostawców rejestrowania, takich jak Serilog, Seq, NLog lub dowolny inny system rejestrowania, który integruje się z Microsoft.Extensions.Loggingprogramem . Jeśli system rejestrowania udostępnia element ILoggerProvider, możesz zarejestrować go w AddProviderusłudze :

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

Szczegółowość sterowania

Jeśli logujesz się z innych miejsc w aplikacji, zmiana domyślnego poziomu Debug na może być zbyt szczegółowa. Możesz użyć filtru, aby skonfigurować poziom rejestrowania dla SignalR dzienników. Można to zrobić w kodzie w taki sam sposób jak na serwerze:

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

Ślady sieci

Ostrzeżenie

Ślad sieciowy zawiera pełną zawartość każdego komunikatu wysyłanego przez aplikację. Nigdy nie publikuj nieprzetworzonych śladów sieci z aplikacji produkcyjnych do publicznych forów, takich jak GitHub.

Jeśli wystąpi problem, śledzenie sieci może czasami dostarczyć wiele przydatnych informacji. Jest to szczególnie przydatne, jeśli zamierzasz zgłosić problem w naszym monitorze problemów.

Zbieranie śledzenia sieci za pomocą programu Fiddler (preferowana opcja)

Ta metoda działa dla wszystkich aplikacji.

Fiddler to bardzo zaawansowane narzędzie do zbierania śladów HTTP. Zainstaluj ją z telerik.com/fiddler, uruchom ją, a następnie uruchom aplikację i odtwórz problem. Program Fiddler jest dostępny dla systemu Windows i istnieją wersje beta dla systemów macOS i Linux.

W przypadku nawiązywania połączenia przy użyciu protokołu HTTPS należy wykonać kilka dodatkowych kroków, aby upewnić się, że program Fiddler może odszyfrować ruch HTTPS. Aby uzyskać więcej informacji, zobacz dokumentację programu Fiddler.

Po zebraniu śladu możesz wyeksportować ślad, wybierając pozycję Plik>Zapisz>wszystkie sesje na pasku menu.

Exporting all sessions from Fiddler

Zbieranie śledzenia sieci za pomocą protokołu tcpdump (tylko systemy macOS i Linux)

Ta metoda działa dla wszystkich aplikacji.

Nieprzetworzone ślady TCP można zbierać przy użyciu protokołu tcpdump, uruchamiając następujące polecenie w powłoce poleceń. Jeśli wystąpi błąd uprawnień, może być konieczne root użycie polecenia sudo lub jego prefiks:

tcpdump -i [interface] -w trace.pcap

Zastąp [interface] element interfejsem sieciowym, którego chcesz przechwycić. Zazwyczaj jest to coś takiego jak /dev/eth0 (dla standardowego interfejsu Ethernet) lub /dev/lo0 (dla ruchu localhost). Aby uzyskać więcej informacji, zobacz tcpdump stronę człowieka w systemie hosta.

Zbieranie śledzenia sieci w przeglądarce

Ta metoda działa tylko w przypadku aplikacji opartych na przeglądarce.

Większość konsol dla deweloperów przeglądarki ma kartę "Sieć", która umożliwia przechwytywanie aktywności sieciowej między przeglądarką a serwerem. Jednak te ślady nie obejmują komunikatów protokołu WebSocket i zdarzeń wysłanych przez serwer. Jeśli używasz tych transportów, lepszym rozwiązaniem jest użycie narzędzia takiego jak Fiddler lub TcpDump (opisane poniżej).

Microsoft Edge i Internet Explorer

(Instrukcje są takie same dla przeglądarki Edge i Internet Explorer)

  1. Naciśnij klawisz F12, aby otworzyć narzędzia deweloperskie
  2. Kliknij kartę Sieć
  3. Odśwież stronę (w razie potrzeby) i odtwórz problem
  4. Kliknij ikonę Zapisz na pasku narzędzi, aby wyeksportować ślad jako plik "HAR":

The Save Icon on the Microsoft Edge Dev Tools Network Tab

Google Chrome

  1. Naciśnij klawisz F12, aby otworzyć narzędzia deweloperskie
  2. Kliknij kartę Sieć
  3. Odśwież stronę (w razie potrzeby) i odtwórz problem
  4. Kliknij prawym przyciskiem myszy dowolne miejsce na liście żądań i wybierz pozycję "Zapisz jako PLIK HAR z zawartością":

Mozilla Firefox

  1. Naciśnij klawisz F12, aby otworzyć narzędzia deweloperskie
  2. Kliknij kartę Sieć
  3. Odśwież stronę (w razie potrzeby) i odtwórz problem
  4. Kliknij prawym przyciskiem myszy dowolne miejsce na liście żądań i wybierz pozycję "Zapisz wszystko jako HAR"

Dołączanie plików diagnostycznych do problemów z usługą GitHub

Możesz dołączyć pliki diagnostyczne do problemów z usługą .txt GitHub, zmieniając ich nazwy, aby mieć rozszerzenie, a następnie przeciągając je i upuszczając do problemu.

Uwaga

Nie wklej zawartości plików dziennika ani śladów sieciowych do problemu z usługą GitHub. Te dzienniki i ślady mogą być dość duże, a usługa GitHub zwykle je obcina.

Dragging log files on to a GitHub issue

Mierniki

Metryki to reprezentacja miar danych w odstępach czasu. Na przykład żądania na sekundę. Dane metryk umożliwiają obserwację stanu aplikacji na wysokim poziomie. Metryki gRPC platformy .NET są emitowane przy użyciu polecenia EventCounter.

SignalR Metryki serwera

SignalR Metryki serwera są raportowane w źródle Microsoft.AspNetCore.Http.Connections zdarzeń.

Nazwa/nazwisko opis
connections-started Łączna liczba rozpoczętych połączeń
connections-stopped Łączna liczba zatrzymanych połączeń
connections-timed-out Przekroczono łączny limit czasu połączeń
current-connections Bieżące połączenia
connections-duration Średni czas trwania połączenia

Obserwowanie metryk

dotnet-counters to narzędzie do monitorowania wydajności na potrzeby monitorowania kondycji ad hoc i badania wydajności pierwszego poziomu. Monitoruj aplikację platformy .NET przy użyciu Microsoft.AspNetCore.Http.Connections jako nazwę dostawcy. Przykład:

> 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

Dodatkowe zasoby