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 konfiguracji opartej na formacie JSON, 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. Na 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.Logging
programem . Jeśli system rejestrowania udostępnia element ILoggerProvider
, możesz zarejestrować go w AddProvider
usł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.
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)
- Naciśnij F12, aby otworzyć narzędzia deweloperskie
- Kliknij kartę Sieć
- Odśwież stronę (w razie potrzeby) i odtwórz problem
- Kliknij ikonę Zapisz na pasku narzędzi, aby wyeksportować ślad jako plik "HAR":
Google Chrome
- Naciśnij F12, aby otworzyć narzędzia deweloperskie
- Kliknij kartę Sieć
- Odśwież stronę (w razie potrzeby) i odtwórz problem
- Kliknij prawym przyciskiem myszy dowolne miejsce na liście żądań i wybierz pozycję "Zapisz jako PLIK HAR z zawartością":
Mozilla Firefox
- Naciśnij F12, aby otworzyć narzędzia deweloperskie
- Kliknij kartę Sieć
- Odśwież stronę (w razie potrzeby) i odtwórz problem
- 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.
Metryki
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. Na 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