Sdílet prostřednictvím


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 JSkonfiguraci na základě on-based, 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ňVerbosena . 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 configureLoggingHubConnectionBuilder:

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 ConfigureLoggingWebHostBuilder 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.

Exporting all sessions from Fiddler

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.

  1. Stisknutím klávesy F12 otevřete Dev Tools.
  2. Klikněte na kartu Síť.
  3. Aktualizujte stránku (v případě potřeby) a reprodukujte problém.
  4. Kliknutím na ikonu Uložit na panelu nástrojů vyexportujte trasování jako soubor HAR:

The Save Icon on the Microsoft Edge Dev Tools Network Tab

Google Chrome

  1. Stisknutím klávesy F12 otevřete Dev Tools.
  2. Klikněte na kartu Síť.
  3. Aktualizujte stránku (v případě potřeby) a reprodukujte problém.
  4. Klikněte pravým tlačítkem na libovolné místo v seznamu požadavků a zvolte Uložit jako HAR s obsahem:

Mozilla Firefox

  1. Stisknutím klávesy F12 otevřete Dev Tools.
  2. Klikněte na kartu Síť.
  3. Aktualizujte stránku (v případě potřeby) a reprodukujte problém.
  4. 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.

Dragging log files on to a GitHub issue

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

Další materiály