作者: Andrew Stanton
本文介绍如何从 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
与传输相关的日志 –,如 Websocket、长轮询和服务器发送事件以及低级别 SignalR 基础结构。若要启用 SignalR的详细日志,请通过将以下项添加到 Logging
中的 LogLevel
子节,将前面的两个前缀配置为appsettings文件中的 Debug
级别:
{ "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
级别产生非常低级别的诊断,很少需要诊断应用程序中的问题。
访问服务器端日志的方式取决于运行的环境。
如果在控制台应用中运行,则默认情况下应启用控制台记录器。 SignalR 日志将显示在控制台中。
Visual Studio 会在 "输出" 窗口中显示日志输出。 选择ASP.NET Core Web 服务器"下拉选项。
在 Azure App Service 门户的 "诊断日志" 部分中,启用 "应用程序日志记录(文件系统) " 选项,并将级别配置为 Verbose
。 日志流服务和应用服务文件系统的日志中应提供日志。 有关详细信息,请参阅Azure 日志流式处理。
如果将应用部署到另一个环境(例如 Docker、Kubernetes 或 Windows 服务),请参阅 .NET Core 和 ASP.NET Core 中的日志记录,了解有关如何配置适用于环境的日志记录提供程序的详细信息。
警告
客户端日志可能包含应用中的敏感信息。 请勿将原始日志从生产应用发布到 GitHub 等公共论坛。
使用 JavaScript 客户端时,可以使用 HubConnectionBuilder
上的 configureLogging
方法配置日志记录选项:
let connection = new signalR.HubConnectionBuilder() .withUrl("/my/hub/url") .configureLogging(signalR.LogLevel.Debug) .build();
若要完全禁用日志记录,请在 configureLogging
方法中指定 signalR.LogLevel.None
。
下表显示了可用于 JavaScript 客户端的日志级别。 将日志级别设置为这些值之一,可以在表中对该级别和其之上的所有级别进行日志记录。
层次 | 描述 |
---|---|
None |
不记录任何消息。 |
Critical |
指示整个应用程序中的失败的消息。 |
Error |
指示当前操作失败的消息。 |
Warning |
指示非严重问题的消息。 |
Information |
信息性消息。 |
Debug |
诊断消息对于调试很有用。 |
Trace |
旨在诊断特定问题的详细诊断消息。 |
配置详细级别后,日志将写入浏览器控制台(或 NodeJS 应用中的标准输出)。
如果要将日志发送到自定义日志记录系统,可以提供实现 ILogger
接口的 JavaScript 对象。 需要实现的唯一方法是 log
,它将使用事件的级别和与事件关联的消息。 例如:
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();
警告
客户端日志可能包含应用中的敏感信息。 请勿将原始日志从生产应用发布到 GitHub 等公共论坛。
若要从 .NET 客户端获取日志,可以使用 HubConnectionBuilder
上的 ConfigureLogging
方法。 这与 WebHostBuilder
和 HostBuilder
上的 ConfigureLogging
方法的工作方式相同。 你可以配置 ASP.NET Core 中使用的相同日志记录提供程序。 但是,您必须为单独的日志提供程序手动安装和启用 NuGet 包。
若要启用控制台日志记录,请添加""。 然后,使用 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 中切换到 "输出" 窗口。 安装 " ",然后使用 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 是一个非常强大的工具,用于收集 HTTP 跟踪。 从telerik.com/fiddler安装它,启动它,然后运行你的应用程序并重现此问题。 Fiddler 适用于 Windows,并且有适用于 macOS 和 Linux 的 beta 版本。
如果使用 HTTPS 进行连接,则需要执行一些额外的步骤来确保 Fiddler 可以解密 HTTPS 流量。 有关更多详细信息,请参阅Fiddler 文档。
收集跟踪后,可以通过从菜单栏中选择 "文件" "文件" > "保存" > 所有会话"来导出跟踪。
此方法适用于所有应用。
可以通过在命令行界面中运行以下命令,使用 tcpdump 收集原始 TCP 跟踪。 如果出现权限错误,你可能需要 root
,或在命令前面加上前缀 sudo
:
tcpdump -i [interface] -w trace.pcap
将 [interface]
替换为要捕获的网络接口。 通常,这与 /dev/eth0
(适用于标准以太网接口)或 /dev/lo0
(对于 localhost 流量)类似。 有关详细信息,请参阅主机系统上的 tcpdump
手册页。
此方法仅适用于基于浏览器的应用。
大多数浏览器开发人员工具都有一个 "网络" 选项卡,该选项卡允许您捕获浏览器和服务器之间的网络活动。 但是,这些跟踪不包括 WebSocket 和服务器发送的事件消息。 如果正在使用这些传输,则使用 Fiddler 或 TcpDump 等工具(如下所述)是更好的方法。
(对于边缘和 Internet Explorer,说明是相同的)
可以通过对其进行重命名,将诊断文件附加到 GitHub 问题,以便它们具有 .txt
扩展,然后将其拖放到问题上。
备注
请不要将日志文件或网络跟踪的内容粘贴到 GitHub 问题中。 这些日志和跟踪可能会很大,GitHub 通常会将其截断。