Compartir a través de


Registro y diagnóstico en SignalR de ASP.NET Core

Por Andrew Stanton-Nurse

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 usas la configuración basada en JSON, establece 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 hayas 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.

Exportar todas las sesiones desde Fiddler

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)

  1. Presione F12 para abrir las Herramientas de desarrollo
  2. Haga clic en la pestaña Red
  3. Si es necesario, actualice la página y reproduzca el problema
  4. Haga clic en el icono Guardar de la barra de herramientas para exportar el seguimiento como archivo "HAR":

El icono Guardar en la pestaña Red de las Herramientas de desarrollo de Microsoft Edge

Google Chrome

  1. Presione F12 para abrir las Herramientas de desarrollo
  2. Haga clic en la pestaña Red
  3. Si es necesario, actualice la página y reproduzca el problema
  4. Haga clic con el botón derecho en cualquier parte de la lista de solicitudes y elija "Guardar como HAR con contenido":

Opción

Mozilla Firefox

  1. Presione F12 para abrir las Herramientas de desarrollo
  2. Haga clic en la pestaña Red
  3. Si es necesario, actualice la página y reproduzca el problema
  4. Haga clic con el botón derecho en la lista de solicitudes y elija "Guardar todo como HAR"

Opción

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.

Arrastrar archivos de registro a una incidencia de GitHub

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

Recursos adicionales