Protokolování a diagnostika v ASP.NET Core SignalR
Andrew Stanton-Nurse
Tento článek obsahuje pokyny ke shromažďování diagnostiky z aplikace ASP.NET Core SignalR , které vám pomůžou s řešením problémů.
Protokolování na straně serveru
Upozorňující
Protokoly na straně serveru můžou obsahovat citlivé informace z vaší aplikace. Nikdy nezpracované protokoly z produkčních aplikací neposílejte na veřejná fóra, jako je GitHub.
Vzhledem k tomu SignalR , že je součástí ASP.NET Core, používá systém protokolování ASP.NET Core. Ve výchozí konfiguraci SignalR protokoluje velmi málo informací, ale je to možné nakonfigurovat. Podrobnosti o konfiguraci protokolování ASP.NET Core najdete v dokumentaci k protokolování ASP.NET Core.
SignalR používá dvě kategorie protokolovacího nástroje:
Microsoft.AspNetCore.SignalR
: Pro protokoly související s protokoly centra, aktivaci Hubs, vyvolání metod a dalších aktivit souvisejících s centrem.Microsoft.AspNetCore.Http.Connections
: Protokoly související s přenosy, jako jsou WebSockets, Long Polling, Server-Sent Events a low-level SignalR infrastructure.
Pokud chcete povolit podrobné protokoly z SignalR, nakonfigurujte obě předchozí předpony na Debug
úroveň souboru appsettings.json
přidáním následujících položek do LogLevel
dílčí části v Logging
:
{
"Logging": {
"LogLevel": {
"Default": "Debug",
"System": "Information",
"Microsoft": "Information",
"Microsoft.AspNetCore.SignalR": "Debug",
"Microsoft.AspNetCore.Http.Connections": "Debug"
}
}
}
Můžete ho také nakonfigurovat v kódu ve své CreateWebHostBuilder
metodě:
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>();
Pokud nepoužíváte konfiguraci založenou na formátu JSON, nastavte v konfiguračním systému následující hodnoty konfigurace:
Logging:LogLevel:Microsoft.AspNetCore.SignalR
=Debug
Logging:LogLevel:Microsoft.AspNetCore.Http.Connections
=Debug
Projděte si dokumentaci ke konfiguračnímu systému a zjistěte, jak zadat vnořené hodnoty konfigurace. Například při použití proměnných prostředí se místo znaku :
(napříkladLogging__LogLevel__Microsoft.AspNetCore.SignalR
) použijí dva _
znaky.
Při shromažďování podrobnější diagnostiky pro vaši aplikaci doporučujeme použít Debug
úroveň. Úroveň Trace
vytváří velmi nízkou úroveň diagnostiky a je zřídka nutná k diagnostice problémů ve vaší aplikaci.
Přístup k protokolům na straně serveru
Přístup k protokolům na straně serveru závisí na prostředí, ve kterém pracujete.
Jako konzolová aplikace mimo službu IIS
Pokud používáte konzolovou aplikaci, protokolovací nástroj konzoly by měl být ve výchozím nastavení povolený. SignalR Protokoly se zobrazí v konzole.
V rámci služby IIS Express ze sady Visual Studio
Visual Studio zobrazí výstup protokolu v okně Výstup . Vyberte možnost rozevíracího seznamu ASP.NET Základní komponenty webového serveru.
Azure App Service
V části Diagnostické protokoly portálu služby Aplikace Azure Service portal povolte možnost Protokolování aplikace (Systém souborů) a nakonfigurujte úroveň Verbose
na . Protokoly by měly být dostupné ze služby streamování protokolů a v protokolech v systému souborů služby App Service. Další informace najdete v tématu Streamování protokolů Azure.
Ostatní prostředí
Pokud je aplikace nasazená do jiného prostředí (například Docker, Kubernetes nebo Windows Service), přečtěte si další informace o konfiguraci zprostředkovatelů protokolování vhodných pro prostředí v .NET Core a ASP.NET Core .
Protokolování klienta JavaScriptu
Upozorňující
Protokoly na straně klienta můžou obsahovat citlivé informace z vaší aplikace. Nikdy nezpracované protokoly z produkčních aplikací neposílejte na veřejná fóra, jako je GitHub.
Při použití javascriptového klienta můžete nakonfigurovat možnosti protokolování pomocí metody v configureLogging
HubConnectionBuilder
:
let connection = new signalR.HubConnectionBuilder()
.withUrl("/my/hub/url")
.configureLogging(signalR.LogLevel.Debug)
.build();
Chcete-li zakázat protokolování architektury, zadejte signalR.LogLevel.None
v configureLogging
metodě. Upozorňujeme, že některé protokolování se vygeneruje přímo v prohlížeči a není možné ho zakázat nastavením úrovně protokolu.
Následující tabulka uvádí úrovně protokolů dostupné pro javascriptového klienta. Nastavení úrovně protokolu na jednu z těchto hodnot umožňuje protokolování na této úrovni a všechny úrovně nad ní v tabulce.
Level | Popis |
---|---|
None |
Nejsou zaprotokolovány žádné zprávy. |
Critical |
Zprávy, které označují selhání v celé aplikaci |
Error |
Zprávy, které označují selhání v aktuální operaci |
Warning |
Zprávy, které značí problém, který není závažná. |
Information |
Informační zprávy. |
Debug |
Diagnostické zprávy užitečné pro ladění. |
Trace |
Velmi podrobné diagnostické zprávy navržené pro diagnostiku konkrétních problémů. |
Jakmile nakonfigurujete úroveň podrobností, protokoly se zapíšou do konzoly prohlížeče (nebo standardní výstup v aplikaci NodeJS).
Pokud chcete odesílat protokoly do vlastního systému protokolování, můžete zadat javascriptový objekt, který implementuje ILogger
rozhraní. Jedinou metodou, kterou je potřeba implementovat, je log
, která přebírá úroveň události a zprávy přidružené k události. Příklad:
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();
Protokolování klienta .NET
Upozorňující
Protokoly na straně klienta můžou obsahovat citlivé informace z vaší aplikace. Nikdy nezpracované protokoly z produkčních aplikací neposílejte na veřejná fóra, jako je GitHub.
K získání protokolů z klienta .NET můžete použít metodu ConfigureLogging
na HubConnectionBuilder
. To funguje stejně jako metoda na ConfigureLogging
WebHostBuilder
a HostBuilder
. Můžete nakonfigurovat stejné poskytovatele protokolování, které používáte v ASP.NET Core. Musíte ale ručně nainstalovat a povolit balíčky NuGet pro jednotlivé zprostředkovatele protokolování.
Pokud chcete do Blazor WebAssembly aplikace přidat protokolování klienta .NET, přečtěte si informace o protokolování ASP.NET CoreBlazor.
Protokolování konzoly
Chcete-li povolit protokolování konzoly, přidejte balíček Microsoft.Extensions.Logging.Console . Pak pomocí AddConsole
metody nakonfigurujte protokolovací nástroj konzoly:
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();
Ladění protokolování výstupního okna
Protokoly můžete také nakonfigurovat tak, aby v sadě Visual Studio přešly do okna Výstup . Nainstalujte balíček Microsoft.Extensions.Logging.Debug a použijte metoduAddDebug
:
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();
Další zprostředkovatelé protokolování
SignalR podporuje jiné zprostředkovatele protokolování, jako jsou Serilog, Seq, NLog nebo jakýkoli jiný protokolovací systém, který se integruje s Microsoft.Extensions.Logging
. Pokud váš systém protokolování poskytuje ILoggerProvider
, můžete ho zaregistrovat v 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();
Kontrola podrobností
Pokud se přihlašujete z jiných míst v aplikaci, může být změna výchozí úrovně Debug
příliš podrobná. Úroveň protokolování pro SignalR protokoly můžete nakonfigurovat pomocí filtru. To lze provést v kódu stejným způsobem jako na serveru:
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();
Trasování sítě
Upozorňující
Trasování sítě obsahuje úplný obsah všech zpráv odesílaných vaší aplikací. Nikdy nezpracované síťové trasování z produkčních aplikací do veřejných fór, jako je GitHub.
Pokud narazíte na problém, může trasování sítě někdy poskytnout spoustu užitečných informací. To je užitečné hlavně v případě, že na našem sledování problémů zadáte problém.
Shromažďování trasování sítě pomocí Fiddleru (upřednostňovaná možnost)
Tato metoda funguje pro všechny aplikace.
Fiddler je velmi výkonný nástroj pro shromažďování trasování HTTP. Nainstalujte ho z telerik.com/fiddler, spusťte ji a spusťte aplikaci a reprodukujte problém. Fiddler je k dispozici pro Windows a pro macOS a Linux existují beta verze.
Pokud se připojujete pomocí protokolu HTTPS, existuje několik dalších kroků, které zajistí, že Fiddler dokáže dešifrovat provoz HTTPS. Další podrobnosti najdete v dokumentaci k Fiddleru.
Jakmile trasování shromáždíte, můžete trasování exportovat tak, že v řádku nabídek vyberete Možnost Uložit>>všechny relace souboru.
Shromažďování trasování sítě pomocí protokolu tcpdump (jenom macOS a Linux)
Tato metoda funguje pro všechny aplikace.
Nezpracované trasování TCP můžete shromažďovat pomocí příkazu tcpdump spuštěním následujícího příkazu z příkazového prostředí. Pokud se zobrazí chyba oprávnění, budete možná muset být root
příkazem nebo ho předponovat sudo
:
tcpdump -i [interface] -w trace.pcap
Nahraďte [interface]
síťovým rozhraním, na které chcete zachytávat. Obvykle se jedná o něco podobného /dev/eth0
(pro standardní ethernetové rozhraní) nebo /dev/lo0
(pro provoz místního hostitele). Další informace najdete na tcpdump
stránce pro muže v hostitelském systému.
Shromáždění trasování sítě v prohlížeči
Tato metoda funguje jenom pro aplikace založené na prohlížeči.
Většina konzol nástrojů pro vývojáře prohlížeče má kartu Síť, která umožňuje zachytit síťovou aktivitu mezi prohlížečem a serverem. Tyto trasování ale nezahrnují zprávy události WebSocket a Server-Sent. Pokud tyto přenosy používáte, je vhodnější použít nástroj, jako je Fiddler nebo TcpDump (popsaný níže).
Microsoft Edge a Internet Explorer
(Pokyny jsou stejné pro Edge i Internet Explorer.
- Stisknutím klávesy F12 otevřete Dev Tools.
- Klikněte na kartu Síť.
- Aktualizujte stránku (v případě potřeby) a reprodukujte problém.
- Kliknutím na ikonu Uložit na panelu nástrojů vyexportujte trasování jako soubor HAR:
Google Chrome
- Stisknutím klávesy F12 otevřete Dev Tools.
- Klikněte na kartu Síť.
- Aktualizujte stránku (v případě potřeby) a reprodukujte problém.
- Klikněte pravým tlačítkem na libovolné místo v seznamu požadavků a zvolte Uložit jako HAR s obsahem:
Mozilla Firefox
- Stisknutím klávesy F12 otevřete Dev Tools.
- Klikněte na kartu Síť.
- Aktualizujte stránku (v případě potřeby) a reprodukujte problém.
- Klikněte pravým tlačítkem na libovolné místo v seznamu požadavků a zvolte Uložit vše jako HAR.
Problémy s připojením diagnostických souborů k GitHubu
Diagnostické soubory můžete připojit k problémům GitHubu tak, že je přejmenujete, aby měly příponu .txt
a potom je přetahovaly na problém.
Poznámka:
Do problému GitHubu nevkládejte obsah souborů protokolů ani trasování sítě. Tyto protokoly a trasování můžou být poměrně velké a GitHub je obvykle zkracuje.
Metriky
Metriky jsou reprezentací datových měr v časových intervalech. Například požadavky za sekundu. Data metrik umožňují sledovat stav aplikace na vysoké úrovni. Metriky .NET gRPC se generují pomocí EventCounter.
SignalR metriky serveru
SignalR Metriky serveru jsou hlášeny ve zdroji Microsoft.AspNetCore.Http.Connections událostí.
Název | Popis |
---|---|
connections-started |
Celkový počet spuštěných připojení |
connections-stopped |
Celkový počet zastavených připojení |
connections-timed-out |
Časový limit celkového počtu připojení vypršel. |
current-connections |
Aktuální připojení |
connections-duration |
Průměrná doba trvání připojení |
Sledování metrik
dotnet-counters je nástroj pro monitorování výkonu pro monitorování stavu ad hoc a prošetření výkonu na první úrovni. Monitorujte aplikaci .NET s Microsoft.AspNetCore.Http.Connections
názvem zprostředkovatele. Příklad:
> 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