Ведение журнала и диагностика в ASP.NET CoreSignalR

Эндрю Стэнтон-Медсестра

В этой статье приводятся рекомендации по сбору диагностика из приложения ASP.NET Core SignalR для устранения неполадок.

Ведение журнала на стороне сервера

Предупреждение

Журналы на стороне сервера могут содержать конфиденциальные сведения из приложения. Никогда не публикуйте необработанные журналы из рабочих приложений на общедоступных форумах, таких как GitHub.

Так как SignalR он входит в состав ASP.NET Core, он использует систему ведения журнала ASP.NET Core. В конфигурации по умолчанию журналы очень мало информации, SignalR но это может быть настроено. Подробные сведения о настройке ведения журналов в ASP.NET Core см. в документации по ведению журналов в ASP.NET Core.

SignalR использует две категории средства ведения журнала:

  • Microsoft.AspNetCore.SignalR: для журналов, связанных с протоколами Концентраторов, активацией центров, вызовом методов и другими действиями, связанными с Концентратором.
  • Microsoft.AspNetCore.Http.Connections: для журналов, связанных с транспортами, такими как WebSockets, Long Polling, Server-Sent Events и низкоуровневая SignalR инфраструктура.

Чтобы включить подробные журналы, настройте оба предыдущих префикса SignalRна Debug уровень в appsettings.json файле, добавив следующие элементы в LogLevel подраздел :Logging

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

Вы также можете настроить это в коде в методе 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>();

Если вы не используете JSконфигурацию на основе on, задайте следующие значения конфигурации в вашей системе конфигурации:

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

Сведения о задании вложенных значений конфигурации см. в документации по своей системе конфигурации. Так, при использовании переменных среды вместо символа : применяются два символа _ (например, Logging__LogLevel__Microsoft.AspNetCore.SignalR).

При сборе подробных диагностических данных для приложения мы рекомендуем использовать уровень Debug. На уровне Trace создаются очень подробные диагностические данные, которые редко требуются для диагностики проблем в приложении.

Доступ к журналам на стороне сервера

Способ доступа к журналам на стороне сервера зависит от среды, в которой выполняется приложение.

Как консольное приложение за пределами IIS

В консольном приложении по умолчанию должно быть включено средство ведения журнала консоли. SignalR Журналы будут отображаться в консоли.

В IIS Express из Visual Studio

Visual Studio отображает выходные данные журнала в окне вывода . Выберите параметр раскрывающегося списка ASP.NET основной веб-сервер.

Служба приложений Azure

Включите параметр ведения журнала приложений (файловая система) в разделе журналов диагностики на портале службы приложение Azure и настройте уровень на Verbose. Журналы должны быть доступны из службы потоковой передачи журналов и в журналах файловой системы Служба приложений. Дополнительные сведения см. в статье "Потоковая передача журналов Azure".

Другие среды

Если приложение развернуто в другой среде (например, Docker, Kubernetes или службе Windows), обратитесь к статье Ведение журнала в .NET Core и ASP.NET Core за дополнительными сведениями о настройке подходящих поставщиков ведения журнала.

Ведение журнала клиента JavaScript

Предупреждение

Журналы на стороне клиента могут содержать конфиденциальные сведения из приложения. Никогда не публикуйте необработанные журналы из рабочих приложений на общедоступных форумах, таких как GitHub.

При использовании клиента JavaScript можно настроить параметры ведения журнала с помощью configureLogging метода в HubConnectionBuilder:

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

Чтобы отключить ведение журнала платформы, укажите signalR.LogLevel.None в методе configureLogging . Обратите внимание, что некоторые журналы создаются непосредственно браузером и не могут быть отключены с помощью настройки уровня журнала.

В следующей таблице показаны уровни журналов, доступные клиенту JavaScript. Установка уровня журнала на один из этих значений включает ведение журнала на этом уровне и все уровни над ней в таблице.

Level Description
None Сообщения не регистрируются.
Critical Сообщения, указывающие на сбой во всем приложении.
Error Сообщения, указывающие на сбой в текущей операции.
Warning Сообщения, указывающие неустранимую проблему.
Information Информационные сообщения.
Debug Диагностические сообщения, полезные для отладки.
Trace Очень подробные диагностические сообщения, предназначенные для диагностики конкретных проблем.

После настройки детализации журналы записываются в консоль браузера (или стандартные выходные данные в приложении узлаJS ).

Если вы хотите отправить журналы в настраиваемую систему ведения журнала, можно предоставить объект JavaScript, реализующий ILogger интерфейс. Единственным методом, который необходимо реализовать, является logто, что принимает уровень события и сообщение, связанное с событием. Например:

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

Ведение журнала клиента .NET

Предупреждение

Журналы на стороне клиента могут содержать конфиденциальные сведения из приложения. Никогда не публикуйте необработанные журналы из рабочих приложений на общедоступных форумах, таких как GitHub.

Чтобы получить журналы из клиента .NET, можно использовать ConfigureLogging метод HubConnectionBuilderв . Это работает так же, как ConfigureLogging метод в WebHostBuilder и HostBuilder. Вы можете настроить те же поставщики ведения журналов, которые используются в ASP.NET Core. Однако необходимо вручную установить и включить пакеты NuGet для отдельных поставщиков ведения журнала.

Сведения о добавлении Blazor WebAssembly ведения журнала клиентов .NET в приложение см. в разделе ASP.NET Ведение журнала CoreBlazor.

Журнал консоли

Чтобы включить ведение журнала консоли, добавьте пакет Microsoft.Extensions.Logging.Console . Затем используйте AddConsole метод для настройки средства ведения журнала консоли:

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

Ведение журнала выходных данных отладки

Журналы также можно настроить для перехода в окно вывода в Visual Studio. Установите пакет Microsoft.Extensions.Logging.Debug и используйте 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();

Другие поставщики ведения журнала

SignalR поддерживает другие поставщики ведения журналов, такие как Serilog, Seq, NLog или любая другая система ведения журнала, которая интегрируется с Microsoft.Extensions.Logging. Если система ведения журнала предоставляет эту ILoggerProviderсистему, ее можно зарегистрировать с помощью 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();

Детализация элементов управления

Если вы выполняете ведение журнала из других мест в приложении, изменение уровня Debug по умолчанию может быть слишком подробным. Фильтр можно использовать для настройки уровня ведения журнала для SignalR журналов. Это можно сделать в коде так же, как на сервере:

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

Данные трассировки сети

Предупреждение

Трассировка сети вмещает полное содержимое каждого сообщения, отправленного приложением. Никогда не публикуйте необработанные трассировки сети из рабочих приложений на общедоступных форумах, таких как GitHub.

При возникновении проблемы трассировка сети иногда может предоставить много полезных сведений. Это особенно полезно, если вы собираетесь отправить проблему в нашем средство отслеживания проблем.

Сбор трассировки сети с помощью Fiddler (предпочтительный вариант)

Этот метод применим для всех приложений.

Fiddler — это очень мощный инструмент для сбора трассировок HTTP. Установите его из telerik.com/fiddler, запустите его, а затем откройте приложение и воспроизведите ошибку. Fiddler доступен для Windows и существует бета-версия для macOS и Linux.

При подключении по протоколу HTTPS необходимо выполнить некоторые дополнительные действия, чтобы убедиться, что Fiddler сможет расшифровать трафик HTTPS. Дополнительные сведения см. в документации По Fiddler.

После сбора трассировки, ее можно экспортировать. Выберите в строке меню Файл>Сохранить>Все сеансы.

Exporting all sessions from Fiddler

Получение трассировки сети с помощью tcpdump (только для macOS и Linux)

Этот метод применим для всех приложений.

Вы можете получить необработанные трассировки TCP с помощью tcpdump, выполнив следующую команду в командной оболочке. Возможно, вам потребуются права привилегированного пользователя root или же будет необходимо ввести префикс команды с помощью sudo, если вы получите ошибку разрешений:

tcpdump -i [interface] -w trace.pcap

Замените на [interface] сетевой интерфейс, который вы хотите использовать. Обычно это что-то похожее на /dev/eth0 (для стандартного интерфейса Ethernet) или /dev/lo0 (для трафика localhost). Дополнительные сведения см. на странице руководства по tcpdump в главной системе.

Сбор трассировки сети в браузере

Этот метод работает только для приложений на основе браузера.

Большинство консоли средств разработчика браузера имеют вкладку "Сеть", которая позволяет записывать сетевое действие между браузером и сервером. Однако эти трассировки не включают сообщения о событиях WebSocket и server-Sent. Если вы используете эти транспорты, то лучше использовать средство, например Fiddler или TcpDump (описано ниже).

Microsoft Edge и Интернет Обозреватель

(Инструкции одинаковы для пограничных и интернет-Обозреватель)

  1. Нажмите клавишу F12, чтобы открыть средства разработки
  2. Щелкните вкладку "Сеть"
  3. Обновите страницу (при необходимости) и воспроизведите проблему
  4. Щелкните значок "Сохранить" на панели инструментов, чтобы экспортировать трассировку в виде ФАЙЛА HAR:

The Save Icon on the Microsoft Edge Dev Tools Network Tab

Google Chrome

  1. Нажмите клавишу F12, чтобы открыть средства разработки
  2. Щелкните вкладку "Сеть"
  3. Обновите страницу (при необходимости) и воспроизведите проблему
  4. Щелкните правой кнопкой мыши в любом месте списка запросов и нажмите кнопку "Сохранить как HAR с содержимым":

Mozilla Firefox

  1. Нажмите клавишу F12, чтобы открыть средства разработки
  2. Щелкните вкладку "Сеть"
  3. Обновите страницу (при необходимости) и воспроизведите проблему
  4. Щелкните правой кнопкой мыши в любом месте списка запросов и нажмите кнопку "Сохранить все как HAR"

Присоединение диагностика файлов к проблемам GitHub

Вы можете подключить файлы диагностики к проблемам GitHub, переименовав их, чтобы они имели .txt расширение, а затем перетаскивание и удаление их в проблему.

Примечание.

Не вставьте содержимое файлов журналов или сетевых трассировок в проблему с GitHub. Эти журналы и трассировки могут быть довольно большими, и GitHub обычно усечение их.

Dragging log files on to a GitHub issue

Метрики

Метрики — это представление мер данных через интервалы времени. Например, запросы в секунду. Метрики позволяют отслеживать общее состояние приложения. Метрики .NET gRPC создаются с помощью EventCounter.

SignalR метрики сервера

SignalR Метрики сервера передаются в Microsoft.AspNetCore.Http.Connections источнике событий.

Имя Описание
connections-started Всего запущенных подключений
connections-stopped Общее количество остановленных подключений
connections-timed-out Общее время ожидания подключений
current-connections Текущие подключения
connections-duration Средняя длительность подключения

Отслеживание метрик

dotnet-counters — это средство мониторинга производительности и первого уровня анализа производительности. Отслеживайте приложение .NET в Microsoft.AspNetCore.Http.Connections качестве имени поставщика. Например:

> 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

Дополнительные ресурсы