Ведение журнала и диагностика в 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>();
Если вы не используете конфигурацию на основе JSON, задайте следующие значения конфигурации в вашей системе конфигурации:
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 |
Очень подробные диагностические сообщения, предназначенные для диагностики конкретных проблем. |
После настройки детализации журналы будут записаны в консоль браузера (или стандартные выходные данные в приложении NodeJS).
Если вы хотите отправить журналы в настраиваемую систему ведения журнала, можно предоставить объект 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.
После сбора трассировки, ее можно экспортировать. Выберите в строке меню Файл>Сохранить>Все сеансы.
Получение трассировки сети с помощью 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 и Internet Explorer
(Инструкции одинаковы для Edge и Internet Explorer)
- Нажмите клавишу F12, чтобы открыть средства разработки
- Щелкните вкладку "Сеть"
- Обновите страницу (при необходимости) и воспроизведите проблему
- Щелкните значок "Сохранить" на панели инструментов, чтобы экспортировать трассировку в виде ФАЙЛА HAR:
Google Chrome
- Нажмите клавишу F12, чтобы открыть средства разработки
- Щелкните вкладку "Сеть"
- Обновите страницу (при необходимости) и воспроизведите проблему
- Щелкните правой кнопкой мыши в любом месте списка запросов и нажмите кнопку "Сохранить как HAR с содержимым":
Mozilla Firefox
- Нажмите клавишу F12, чтобы открыть средства разработки
- Щелкните вкладку "Сеть"
- Обновите страницу (при необходимости) и воспроизведите проблему
- Щелкните правой кнопкой мыши в любом месте списка запросов и нажмите кнопку "Сохранить все как HAR"
Присоединение диагностика файлов к проблемам GitHub
Вы можете подключить файлы диагностики к проблемам GitHub, переименовав их, чтобы они имели .txt
расширение, а затем перетаскивание и удаление их в проблему.
Примечание.
Не вставьте содержимое файлов журналов или сетевых трассировок в проблему с GitHub. Эти журналы и трассировки могут быть довольно большими, и GitHub обычно усечение их.
Метрики
Метрики — это представление мер данных через интервалы времени. Например, запросы в секунду. Метрики позволяют отслеживать общее состояние приложения. Метрики .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
Дополнительные ресурсы
ASP.NET Core