Registrazione e diagnostica in ASP.NET Core SignalR
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 la configurazione basata su JSON, 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 include il contenuto completo di ogni messaggio inviato dall'app. Non pubblicare mai tracce di rete non elaborate dalle app di produzione in 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.
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 eseguire l'acquisizione. In genere, si tratta di /dev/eth0
(per l'interfaccia Ethernet standard) o /dev/lo0
(per il traffico localhost). Per altre informazioni, vedere la pagina tcpdump
principale nel 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)
- Premere F12 per aprire Dev Tools
- Fare clic sulla scheda Rete
- Se necessario, aggiornare la pagina e riprodurre il problema
- Fare clic sull'icona Salva sulla barra degli strumenti per esportare la traccia come file "HAR":
Google Chrome
- Premere F12 per aprire Dev Tools
- Fare clic sulla scheda Rete
- Se necessario, aggiornare la pagina e riprodurre il problema
- 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
- Premere F12 per aprire Dev Tools
- Fare clic sulla scheda Rete
- Se necessario, aggiornare la pagina e riprodurre il problema
- 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.
Metrica
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