Registro y diagnóstico en SignalR de ASP.NET Core
En este artículo se proporcionan instrucciones para recopilar diagnósticos de su aplicación SignalR de ASP.NET Core para ayudar a solucionar problemas.
Registro del lado servidor
Advertencia
Los registros del lado servidor pueden contener información confidencial de la aplicación. Nunca publique registros sin procesar de las aplicaciones de producción en foros públicos como GitHub.
Como los servicios de SignalR son parte de ASP.NET Core, usa el sistema de registro de ASP.NET Core. En la configuración predeterminada, SignalR registra muy poca información, pero esto se puede configurar. Vea la documentación sobre el registro de ASP.NET Core para obtener más información sobre la configuración del registro de ASP.NET Core.
SignalR usa dos categorías de registrador:
Microsoft.AspNetCore.SignalR
: para los registros relacionados con los protocolos de concentrador, la activación de centros de conectividad, la invocación de métodos y otras actividades relacionadas con el concentrador.Microsoft.AspNetCore.Http.Connections
: para los registros relacionados con los transportes, como WebSockets, Sondeo largo, Eventos de Server-Sent e Infraestructura de SignalR de bajo nivel.
Para habilitar registros detallados de SignalR, configure los prefijos en el nivel Debug
del archivo appsettings.json
mediante la adición de los siguientes elementos a la subsección de LogLevel
en Logging
:
{
"Logging": {
"LogLevel": {
"Default": "Debug",
"System": "Information",
"Microsoft": "Information",
"Microsoft.AspNetCore.SignalR": "Debug",
"Microsoft.AspNetCore.Http.Connections": "Debug"
}
}
}
También puede configurarlo en el código del método 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>();
Si no usa la configuración basada en JSON, establezca los siguientes valores de configuración en el sistema de configuración:
Logging:LogLevel:Microsoft.AspNetCore.SignalR
=Debug
Logging:LogLevel:Microsoft.AspNetCore.Http.Connections
=Debug
Consulte la documentación del sistema de configuración para determinar cómo especificar valores de configuración anidados. Por ejemplo, al usar variables de entorno, se usan dos caracteres _
en lugar de :
(por ejemplo, Logging__LogLevel__Microsoft.AspNetCore.SignalR
).
Se recomienda usar el nivel Debug
al recopilar diagnósticos más detallados para la aplicación. El nivel Trace
genera diagnósticos de nivel muy bajo y rara vez es necesario para diagnosticar problemas en la aplicación.
Acceso a los registros del lado servidor
La forma de acceder a los registros del lado servidor depende del entorno que se ejecute.
Como aplicación de consola fuera de IIS
Si se ejecuta en una aplicación de consola, el registrador de la consola debe estar habilitado de forma predeterminada. Los registros de SignalR aparecerán en la consola.
Dentro de IIS Express desde Visual Studio
Visual Studio muestra la salida del registro en la ventana Salida. Seleccione la opción desplegable Servidor web de ASP.NET Core.
Azure App Service
Habilite la opción Registro de aplicaciones (sistema de archivos) en la sección Registros de diagnóstico del portal de Azure App Service y configure el Nivel en Verbose
. Los registros deben estar disponibles en el servicio de Streaming de registros y en los registros del sistema de archivos de App Service. Para obtener más información, consulte Streaming de registro de Azure.
Otros entornos
Si la aplicación se implementa en otro entorno (por ejemplo, Docker, Kubernetes o un servicio de Windows), vea Registros en .NET Core y ASP.NET Core para obtener más información sobre cómo configurar los proveedores de registro adecuados para el entorno.
Registros del cliente de JavaScript
Advertencia
Los registros del lado cliente pueden contener información confidencial de la aplicación. Nunca publique registros sin procesar de las aplicaciones de producción en foros públicos como GitHub.
Al usar el cliente de JavaScript, puede configurar las opciones de registro mediante el método configureLogging
en HubConnectionBuilder
:
let connection = new signalR.HubConnectionBuilder()
.withUrl("/my/hub/url")
.configureLogging(signalR.LogLevel.Debug)
.build();
Para deshabilitar el registro del marco, especifique signalR.LogLevel.None
en el método configureLogging
. Tenga en cuenta que el explorador emite algún registro directamente y no se puede deshabilitar mediante el establecimiento del nivel de registro.
En la tabla siguiente se muestran los niveles de registro disponibles para el cliente de JavaScript. Al establecer el nivel de registro en uno de estos valores, se habilita el registro en ese nivel y todos los niveles por encima de él en la tabla.
Nivel | Descripción |
---|---|
None |
No se registran mensajes. |
Critical |
Mensajes que indican un error en toda la aplicación. |
Error |
Mensajes que indican un error en la operación actual. |
Warning |
Mensajes que indican un problema irrecuperable. |
Information |
Mensajes de información. |
Debug |
Mensajes de diagnóstico útiles para la depuración. |
Trace |
Mensajes de diagnóstico muy detallados diseñados para diagnosticar problemas específicos. |
Una vez que haya configurado el nivel de detalle, los registros se escribirán en la consola del explorador (o salida estándar en una aplicación NodeJS).
Si desea enviar registros a un sistema de registro personalizado, puede proporcionar un objeto JavaScript que implemente la interfaz de ILogger
. El único método que debe implementarse es log
, que toma el nivel del evento y el mensaje asociado al evento. Por ejemplo:
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();
Registro de clientes de .NET
Advertencia
Los registros del lado cliente pueden contener información confidencial de la aplicación. Nunca publique registros sin procesar de las aplicaciones de producción en foros públicos como GitHub.
Para obtener registros del cliente de .NET, puede usar el método ConfigureLogging
en HubConnectionBuilder
. Esto funciona de la misma manera que el método ConfigureLogging
en WebHostBuilder
y HostBuilder
. Puede configurar los mismos proveedores de registro que usa en ASP.NET Core. Sin embargo, tiene que instalar y habilitar manualmente los paquetes NuGet para los proveedores de registro individuales.
Para agregar el registro de cliente .NET a una aplicación Blazor WebAssembly, consulte registro de Blazor de ASP.NET Core.
Registro de consolas
Para habilitar el registro de consola, agregue el paquete Microsoft.Extensions.Logging.Console. A continuación, use el método AddConsole
para configurar el registrador de la consola:
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();
Registro de la ventana de salida de depuración
También puede configurar los registros para ir a la ventana Salida de Visual Studio. Instale el paquete Microsoft.Extensions.Logging.Debug y use el método AddDebug
:
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();
Otros proveedores de registro
SignalR admite otros proveedores de registro, como Serilog, Seq, NLog o cualquier otro sistema de registro que se integre con Microsoft.Extensions.Logging
. Si el sistema de registro proporciona un ILoggerProvider
, puede 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();
Nivel de detalle del control
Si va a registrar desde otros lugares de la aplicación, cambiar el nivel predeterminado a Debug
puede ser demasiado detallado. Puede usar un filtro para configurar el nivel de registro para los registros de SignalR. Esto se puede hacer en el código, de la misma manera que en el servidor:
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();
Seguimientos de red
Advertencia
Un seguimiento de red incluye todo el contenido de cada mensaje que envía la aplicación. Nunca publique seguimientos de red sin procesar de las aplicaciones de producción en foros públicos como GitHub.
Si encuentra un problema, un seguimiento de red a veces puede proporcionar mucha información útil. Esto es especialmente útil si vas a presentar una incidencia en nuestro rastreador de incidencias.
Recopilar un seguimiento de red con Fiddler (opción preferida)
Este método funciona para todas las aplicaciones.
Fiddler es una herramienta muy eficaz para recopilar seguimientos HTTP. Instálelo desde telerik.com/fiddler, inícielo y, luego, ejecute la aplicación y reproduzca el problema. Fiddler está disponible para Windows y hay versiones beta para macOS y Linux.
Si se conecta mediante HTTPS, hay algunos pasos adicionales necesarios para asegurarse de que Fiddler pueda descifrar el tráfico HTTPS. Para más información, consulte la Documentación de Fiddler.
Una vez que recopile el seguimiento, si desea exportarlo, elija Archivo>Guardar>Todas las sesiones en la barra de menús.
Recopilación de un seguimiento de red con tcpdump (solo para macOS y Linux)
Este método funciona para todas las aplicaciones.
Para recopilar seguimientos TCP sin procesar mediante tcpdump, ejecute el comando siguiente desde un shell de comandos. Si recibe un error de permisos, es posible que tenga que ser root
o escribir sudo
como prefijo del comando:
tcpdump -i [interface] -w trace.pcap
Reemplace [interface]
por la interfaz de red en la que desea realizar la captura. Por lo general, es algo parecido a /dev/eth0
(para la interfaz Ethernet estándar) o a /dev/lo0
(para el tráfico de localhost). Para más información, consulte la página man tcpdump
en el sistema host.
Recopilar un seguimiento de red en el explorador
Este método solo funciona para aplicaciones basadas en explorador.
Las herramientas de desarrollo de la mayoría de los exploradores tienen una pestaña "Red" que permite capturar la actividad de red entre el explorador y el servidor. Sin embargo, estos seguimientos no incluyen mensajes de WebSocket ni Server-Sent Event. Si usa esos transportes, el uso de una herramienta como Fiddler o TcpDump (que se describe a continuación) es un enfoque mejor.
Microsoft Edge e Internet Explorer
(Las instrucciones son las mismas para Edge e Internet Explorer)
- Presione F12 para abrir las Herramientas de desarrollo
- Haga clic en la pestaña Red
- Si es necesario, actualice la página y reproduzca el problema
- Haga clic en el icono Guardar de la barra de herramientas para exportar el seguimiento como archivo "HAR":
Google Chrome
- Presione F12 para abrir las Herramientas de desarrollo
- Haga clic en la pestaña Red
- Si es necesario, actualice la página y reproduzca el problema
- Haga clic con el botón derecho en cualquier parte de la lista de solicitudes y elija "Guardar como HAR con contenido":
Mozilla Firefox
- Presione F12 para abrir las Herramientas de desarrollo
- Haga clic en la pestaña Red
- Si es necesario, actualice la página y reproduzca el problema
- Haga clic con el botón derecho en la lista de solicitudes y elija "Guardar todo como HAR"
Asociación de archivos de diagnóstico a problemas de GitHub
Puede adjuntar archivos de diagnóstico a problemas de GitHub cambiando su nombre para que tengan una extensión .txt
y, a continuación, arrastrándolos y soltándolos en la incidencia.
Nota:
No pegue el contenido de los archivos de registro ni los seguimientos de red en una incidencia de GitHub. Estos registros y seguimientos pueden ser bastante grandes y GitHub normalmente los trunca.
Métricas
Las métricas son una representación de medidas de datos a lo largo de intervalos de tiempo. Por ejemplo, solicitudes por segundo. Los datos de las métricas permiten observar el estado de una aplicación en un general. Las métricas gRPC de .NET se emiten mediante EventCounter.
Métricas del servidor de SignalR
Las métricas de servicios de SignalR se notifican en el origen del evento Microsoft.AspNetCore.Http.Connections.
Nombre | Descripción |
---|---|
connections-started |
Total de conexiones iniciadas |
connections-stopped |
Total de conexiones detenidas |
connections-timed-out |
Total de conexiones que agotaron el tiempo de espera |
current-connections |
Conexiones actuales |
connections-duration |
Duración media de la conexión |
Observación de métricas
dotnet-counters es una herramienta de supervisión de rendimiento diseñada para la investigación del rendimiento y la supervisión del estado de primer nivel ad hoc. Puede supervisar una aplicación .NET con Microsoft.AspNetCore.Http.Connections
como el nombre del proveedor. Por ejemplo:
> 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