Registrazione e diagnostica in ASP.NET Core SignalR

Di Andrew Stanton-Nurse

Questo articolo fornisce indicazioni per raccogliere la diagnostica dall'app ASP.NET Core SignalR per risolvere i problemi.

Registrazione lato server

Avviso

I log lato server possono contenere informazioni riservate dall'app. Non pubblicare mai log non elaborati dalle app di produzione a forum pubblici come GitHub.

Poiché SignalR fa parte di ASP.NET Core, usa il sistema di registrazione ASP.NET Core. Nella configurazione predefinita registra SignalR pochissime informazioni, ma può essere configurato. Per informazioni dettagliate sulla configurazione della registrazione ASP.NET Core, vedere la documentazione relativa alla registrazione di ASP.NET Core.

SignalR usa due categorie di logger:

  • Microsoft.AspNetCore.SignalR: per i log correlati ai protocolli hub, l'attivazione di Hub, la chiamata di metodi e altre attività correlate all'hub.
  • Microsoft.AspNetCore.Http.Connections: per i log relativi ai trasporti, ad esempio WebSocket, Long Polling, Eventi inviati dal server e infrastruttura di basso livello SignalR .

Per abilitare i log dettagliati da SignalR, configurare entrambi i prefissi precedenti al Debug livello nel appsettings.json file aggiungendo gli elementi seguenti alla LogLevel sottosezione in Logging:

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

È anche possibile configurare questo valore nel codice nel CreateWebHostBuilder metodo :

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

Se non si usa JSla configurazione basata su ON, impostare i valori di configurazione seguenti nel sistema di configurazione:

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

Controllare la documentazione relativa al sistema di configurazione per determinare come specificare i valori di configurazione annidati. Ad esempio, quando si usano variabili di : ambiente, vengono usati due _ caratteri anziché ( ad esempio , Logging__LogLevel__Microsoft.AspNetCore.SignalR).

È consigliabile usare il livello durante la Debug raccolta di diagnostica più dettagliate per l'app. Il Trace livello produce diagnostica di basso livello e raramente è necessario per diagnosticare i problemi nell'app.

Accedere ai log lato server

Il modo in cui si accede ai log lato server dipende dall'ambiente in cui si esegue.

Come app console all'esterno di IIS

Se si esegue in un'app console, il logger console deve essere abilitato per impostazione predefinita. SignalR I log verranno visualizzati nella console.

In IIS Express da Visual Studio

Visual Studio visualizza l'output del log nella finestra Output . Selezionare l'opzione a discesa ASP.NET Server Web Core.

Servizio app di Azure

Abilitare l'opzione Registrazione applicazioni (file system) nella sezione Log di diagnostica del portale del servizio app Azure e configurare Il livello su Verbose. I log devono essere disponibili dal servizio di streaming dei log e nei log nel file system del servizio app. Per altre informazioni, vedere Flusso di log di Azure.

Altri ambienti

Se l'app viene distribuita in un altro ambiente ,ad esempio Docker, Kubernetes o Servizio Windows, vedere Registrazione in .NET Core e ASP.NET Core per altre informazioni su come configurare i provider di registrazione adatti per l'ambiente.

Registrazione client JavaScript

Avviso

I log lato client possono contenere informazioni riservate dall'app. Non pubblicare mai log non elaborati dalle app di produzione a forum pubblici come GitHub.

Quando si usa il client JavaScript, è possibile configurare le opzioni di registrazione usando il configureLogging metodo in HubConnectionBuilder:

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

Per disabilitare la registrazione del framework, specificare signalR.LogLevel.None nel configureLogging metodo . Si noti che alcune registrazioni vengono generate direttamente dal browser e non possono essere disabilitate impostando il livello di log.

La tabella seguente mostra i livelli di log disponibili per il client JavaScript. L'impostazione del livello di log su uno di questi valori consente la registrazione a tale livello e a tutti i livelli sopra di esso nella tabella.

Livello Descrizione
None Non vengono registrati messaggi.
Critical Messaggi che indicano un errore nell'intera app.
Error Messaggi che indicano un errore nell'operazione corrente.
Warning Messaggi che indicano un problema non irreversibile.
Information Messaggi informativi.
Debug Messaggi di diagnostica utili per il debug.
Trace Messaggi di diagnostica molto dettagliati progettati per la diagnosi di problemi specifici.

Dopo aver configurato il livello di dettaglio, i log verranno scritti nella console del browser (o output standard in un'app NodeJS ).

Se si desidera inviare log a un sistema di registrazione personalizzato, è possibile fornire un oggetto JavaScript che implementa l'interfaccia ILogger . L'unico metodo che deve essere implementato è log, che accetta il livello dell'evento e il messaggio associato all'evento. Ad esempio:

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

Registrazione client .NET

Avviso

I log lato client possono contenere informazioni riservate dall'app. Non pubblicare mai log non elaborati dalle app di produzione a forum pubblici come GitHub.

Per ottenere i log dal client .NET, è possibile usare il ConfigureLogging metodo in HubConnectionBuilder. Questa operazione funziona allo stesso modo del ConfigureLogging metodo in WebHostBuilder e HostBuilder. È possibile configurare gli stessi provider di registrazione usati in ASP.NET Core. Tuttavia, è necessario installare e abilitare manualmente i pacchetti NuGet per i singoli provider di registrazione.

Per aggiungere la registrazione client .NET a un'app, vedere registrazione di ASP.NET CoreBlazor.Blazor WebAssembly

Registrazione console

Per abilitare la registrazione della console, aggiungere il pacchetto Microsoft.Extensions.Logging.Console . Usare quindi il AddConsole metodo per configurare il logger della console:

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

Eseguire il debug della registrazione della finestra di output

È anche possibile configurare i log per passare alla finestra Output in Visual Studio. Installare il pacchetto Microsoft.Extensions.Logging.Debug e usare il AddDebug metodo :

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

Altri provider di registrazione

SignalR supporta altri provider di registrazione, ad esempio Serilog, Seq, NLog o qualsiasi altro sistema di registrazione che si integra con Microsoft.Extensions.Logging. Se il sistema di registrazione fornisce un , ILoggerProviderè possibile registrarlo con 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();

Controllare il livello di dettaglio

Se si esegue la registrazione da altre posizioni nell'app, modificare il livello predefinito in modo Debug che sia troppo dettagliato. È possibile usare un filtro per configurare il livello di registrazione per SignalR i log. Questa operazione può essere eseguita nel codice, nello stesso modo del server:

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

Tracce di rete

Avviso

Una traccia di rete contiene il contenuto completo di ogni messaggio inviato dall'app. Non pubblicare mai tracce di rete non elaborate dalle app di produzione a forum pubblici come GitHub.

Se si verifica un problema, una traccia di rete può talvolta fornire molte informazioni utili. Ciò è particolarmente utile se si sta per inviare un problema sul nostro strumento di rilevamento dei problemi.

Raccogliere una traccia di rete con Fiddler (opzione preferita)

Questo metodo funziona per tutte le app.

Fiddler è uno strumento molto potente per la raccolta di tracce HTTP. Installarlo da telerik.com/fiddler, avviarlo e quindi eseguire l'app e riprodurre il problema. Fiddler è disponibile per Windows e sono disponibili versioni beta per macOS e Linux.

Se ci si connette usando HTTPS, esistono alcuni passaggi aggiuntivi per assicurarsi che Fiddler possa decrittografare il traffico HTTPS. Per altri dettagli, vedere la documentazione di Fiddler.

Dopo aver raccolto la traccia, è possibile esportare la traccia scegliendo File>Salva>tutte le sessioni dalla barra dei menu.

Exporting all sessions from Fiddler

Raccogliere una traccia di rete con tcpdump (solo macOS e Linux)

Questo metodo funziona per tutte le app.

È possibile raccogliere tracce TCP non elaborate usando tcpdump eseguendo il comando seguente da una shell dei comandi. Potrebbe essere necessario specificare root o anteporre il comando a sudo se viene visualizzato un errore di autorizzazione:

tcpdump -i [interface] -w trace.pcap

Sostituire [interface] con l'interfaccia di rete su cui si vuole acquisire. In genere, questo è simile /dev/eth0 (per l'interfaccia Ethernet standard) o /dev/lo0 (per il traffico localhost). Per altre informazioni, vedere la pagina man nel tcpdump sistema host.

Raccogliere una traccia di rete nel browser

Questo metodo funziona solo per le app basate su browser.

La maggior parte delle console degli strumenti di sviluppo del browser dispone di una scheda "Rete" che consente di acquisire l'attività di rete tra il browser e il server. Tuttavia, queste tracce non includono i messaggi WebSocket e Eventi inviati dal server. Se si usano questi trasporti, l'uso di uno strumento come Fiddler o TcpDump (descritto di seguito) è un approccio migliore.

Microsoft Edge e Internet Explorer

(Le istruzioni sono le stesse per Edge e Internet Explorer)

  1. Premere F12 per aprire Dev Tools
  2. Fare clic sulla scheda Rete
  3. Aggiornare la pagina (se necessario) e riprodurre il problema
  4. Fare clic sull'icona Salva sulla barra degli strumenti per esportare la traccia come file "HAR":

The Save Icon on the Microsoft Edge Dev Tools Network Tab

Google Chrome

  1. Premere F12 per aprire Dev Tools
  2. Fare clic sulla scheda Rete
  3. Aggiornare la pagina (se necessario) e riprodurre il problema
  4. Fare clic con il pulsante destro del mouse in un punto qualsiasi dell'elenco delle richieste e scegliere "Salva come HAR con contenuto":

Mozilla Firefox

  1. Premere F12 per aprire Dev Tools
  2. Fare clic sulla scheda Rete
  3. Aggiornare la pagina (se necessario) e riprodurre il problema
  4. Fare clic con il pulsante destro del mouse in un punto qualsiasi dell'elenco delle richieste e scegliere "Salva tutto come HAR"

Collegare i file di diagnostica a GitHub

È possibile allegare i file di diagnostica ai problemi di GitHub rinominandoli in modo che abbiano un'estensione .txt e quindi trascinandoli e rilasciandoli al problema.

Nota

Non incollare il contenuto dei file di log o delle tracce di rete in un problema di GitHub. Questi log e tracce possono essere abbastanza grandi e GitHub li tronca in genere.

Dragging log files on to a GitHub issue

Metriche

Le metriche sono una rappresentazione delle misure dei dati in intervalli di tempo. Ad esempio, le richieste al secondo. I dati delle metriche consentono di osservare lo stato di un'app a un livello elevato. Le metriche di .NET gRPC vengono generate usando EventCounter.

SignalR metriche del server

SignalR le metriche del server vengono segnalate nell'origine Microsoft.AspNetCore.Http.Connections evento.

Nome Descrizione
connections-started Totale connessioni avviate
connections-stopped Totale connessioni arrestate
connections-timed-out Timeout totale connessioni
current-connections connessioni correnti
connections-duration Durata media della connessione

Osservare le metriche

dotnet-counters è uno strumento di monitoraggio delle prestazioni per il monitoraggio dell'integrità ad hoc e l'analisi delle prestazioni di primo livello. Monitorare un'app .NET con Microsoft.AspNetCore.Http.Connections come nome del provider. Ad esempio:

> 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

Risorse aggiuntive