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 información mínima, pero se puede configurar el nivel de registro. 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 anteriores en el nivel del Debugappsettings.json archivo agregando los siguientes elementos a la LogLevel subsección en Logging:

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

Los niveles de registro de las SignalR categorías de registrador también se pueden configurar en el código dentro del CreateWebHostBuilder método :

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 Trace nivel genera diagnósticos de bajo nivel y rara vez es necesario para diagnosticar problemas en la aplicación.

Acceso a los registros del lado servidor

El modo en que se accede a los registros del lado servidor depende del entorno en el que se ejecuta la aplicación.

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. SignalR los registros aparecen 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

Para obtener más información sobre cómo configurar proveedores de registro adecuados para distintos entornos de implementación, como Docker, Kubernetes o servicio de Windows, consulte Registro en .NET Core y ASP.NET Core.

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

Deshabilite el registro del marco especificando signalR.LogLevel.None en el configureLogging método . 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

Los registros se pueden configurar 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

Al iniciar sesión desde otros lugares de la aplicación, cambiar el nivel predeterminado a Debug puede ser demasiado detallado. Se puede usar un filtro para configurar el nivel de registro para SignalR los registros. 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();

Seguimiento en SignalR

SignalR El servidor concentrador y el SignalR cliente proporcionan información sobre SignalR las conexiones y los mensajes mediante DiagnosticSource y Activity. SignalR tiene un objeto ActivitySource para el servidor central y el cliente, avaialble a partir de .NET 9.

ActivitySource es un componente que se usa en el seguimiento distribuido para crear y administrar actividades (o intervalos) que representan las operaciones de la aplicación. Estas actividades se pueden usar para:

  • Realice un seguimiento del flujo de solicitudes y operaciones en distintos componentes y servicios.
  • Proporcione información valiosa sobre el rendimiento y el comportamiento de la aplicación.

ActivitySource del servidor SignalR de .NET

El ActivitySource de SignalR denominado Microsoft.AspNetCore.SignalR.Server emite eventos para las llamadas al método del concentrador:

  • Cada método es su propia actividad, por lo que todo lo que emita una actividad durante la llamada al método del centro se encuentra bajo la actividad del método del centro.
  • Las actividades del método del centro no tienen un elemento primario. Esto significa que no se agrupan en la conexión de larga duración SignalR .

En el siguiente ejemplo se usa el panel de .NET Aspire y los paquetes de OpenTelemetry:

<PackageReference Include="OpenTelemetry.Exporter.OpenTelemetryProtocol" Version="1.9.0" />
<PackageReference Include="OpenTelemetry.Extensions.Hosting" Version="1.9.0" />
<PackageReference Include="OpenTelemetry.Instrumentation.AspNetCore" Version="1.9.0" />

Agrega el siguiente código de inicio al archivo Program.cs:

using OpenTelemetry.Trace;
using SignalRChat.Hubs;

// Set OTEL_EXPORTER_OTLP_ENDPOINT environment variable depending on where your OTEL endpoint is.
var builder = WebApplication.CreateBuilder(args);

builder.Services.AddRazorPages();
builder.Services.AddSignalR();

builder.Services.AddOpenTelemetry()
    .WithTracing(tracing =>
    {
        if (builder.Environment.IsDevelopment())
        {
            // View all traces only in development environment.
            tracing.SetSampler(new AlwaysOnSampler());
        }

        tracing.AddAspNetCoreInstrumentation();
        tracing.AddSource("Microsoft.AspNetCore.SignalR.Server");
    });

builder.Services.ConfigureOpenTelemetryTracerProvider(tracing => tracing.AddOtlpExporter());

var app = builder.Build();

La siguiente salida de ejemplo procede del panel Aspire:

Lista de actividades para eventos de llamada al método de SignalR del centro

ASP.NET Core también proporciona sus propias métricas en el Microsoft.AspNetCore.Hosting origen de eventos.

ActivitySource de cliente de SignalR de .NET

El SignalRActivitySource objeto con nombre Microsoft.AspNetCore.SignalR.Client emite eventos para un SignalR cliente:

  • Las invocaciones del centro crean un intervalo de cliente. Otros SignalR clientes, como el cliente de JavaScript, no admiten el seguimiento. Esta característica se agregará a más clientes en futuras versiones.
  • Las invocaciones del concentrador admiten la propagación de contexto en el cliente y el servidor. La propagación del contexto de seguimiento permite un seguimiento distribuido verdadero. Ahora es posible ver las invocaciones fluir del cliente al servidor y viceversa.

Este es el aspecto de estas nuevas actividades en el panel de .NET Aspire:

Rastreo distribuido de SignalR en el panel de Aspire

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 se produce un problema, un seguimiento de red a veces puede proporcionar una información valiosa. Esto es especialmente útil al presentar un problema en nuestro rastreador de problemas.

Recopilar un seguimiento de red con Fiddler (opción preferida)

Este método funciona para todas las aplicaciones.

Fiddler es una herramienta 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.

Después de recopilar el seguimiento, expórtelo seleccionando 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.

Los seguimientos TCP sin procesar se pueden recopilar mediante tcpdump mediante la ejecución del siguiente comando 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. Normalmente, esto es algo parecido /dev/eth0 a (para una interfaz Ethernet estándar) o /dev/lo0 (para el tráfico localhost). Para obtener más información, consulte la tcpdump página manual del sistema host.

Recopilar un seguimiento de red en el explorador

Este método solo funciona para aplicaciones basadas en explorador.

La mayoría de las consolas de herramientas de desarrollo del explorador 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. Al usar esos transportes, el uso de una herramienta como Fiddler o TcpDump es un enfoque mejor, como se describe más adelante en este artículo.

Microsoft Edge e Internet Explorer

(Las instrucciones son las mismas para Microsoft Edge e Internet Explorer)

  1. Abra las herramientas de desarrollo presionando F12.
  2. Seleccione la pestaña Red.
  3. Si es necesario, actualice la página y reproduzca el problema
  4. Seleccione el icono Guardar de la barra de herramientas para exportar el seguimiento como un archivo "HAR":

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

Google Chrome

  1. Abra las herramientas de desarrollo presionando F12.
  2. Seleccione 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. Abra las herramientas de desarrollo presionando F12.
  2. Seleccione 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

Los archivos de diagnóstico se pueden adjuntar a problemas de GitHub cambiando su nombre para que tengan una .txt extensión y, a continuación, arrástrólas y las colocarán en el problema.

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 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 las medidas de datos durante 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 --counters 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