ASP.NET Core SignalR 中的日志记录和诊断

作者: 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 级别产生非常低级别的诊断,很少需要诊断应用程序中的问题。

访问服务器端日志

访问服务器端日志的方式取决于运行的环境。

作为 IIS 外部的控制台应用

如果在控制台应用中运行,则默认情况下应启用控制台记录器 SignalR 日志将显示在控制台中。

在 Visual Studio IIS Express 中

Visual Studio 会在 "输出" 窗口中显示日志输出。 选择ASP.NET Core Web 服务器"下拉选项。

Azure 应用服务

在 Azure App Service 门户的 "诊断日志" 部分中,启用 "应用程序日志记录(文件系统) " 选项,并将级别配置为 Verbose 日志服务和应用服务文件系统的日志中应提供日志。 有关详细信息,请参阅Azure 日志流式处理

其他环境

如果将应用部署到另一个环境(例如 Docker、Kubernetes 或 Windows 服务),请参阅 .NET Core 和 ASP.NET Core 中的日志记录,了解有关如何配置适用于环境的日志记录提供程序的详细信息。

JavaScript 客户端日志记录

警告

客户端日志可能包含应用中的敏感信息。 请勿将原始日志从生产应用发布到 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();

.NET 客户端日志记录

警告

客户端日志可能包含应用中的敏感信息。 请勿将原始日志从生产应用发布到 GitHub 等公共论坛。

若要从 .NET 客户端获取日志,可以使用 HubConnectionBuilder上的 ConfigureLogging 方法。 这与 WebHostBuilderHostBuilder上的 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 收集网络跟踪(首选选项)

此方法适用于所有应用。

Fiddler 是一个非常强大的工具,用于收集 HTTP 跟踪。 telerik.com/fiddler安装它,启动它,然后运行你的应用程序并重现此问题。 Fiddler 适用于 Windows,并且有适用于 macOS 和 Linux 的 beta 版本。

如果使用 HTTPS 进行连接,则需要执行一些额外的步骤来确保 Fiddler 可以解密 HTTPS 流量。 有关更多详细信息,请参阅Fiddler 文档

收集跟踪后,可以通过从菜单栏中选择 "文件" "文件" > "保存" > 所有会话"来导出跟踪。

正在从 Fiddler 导出所有会话

使用 tcpdump 收集网络跟踪(仅限 macOS 和 Linux)

此方法适用于所有应用。

可以通过在命令行界面中运行以下命令,使用 tcpdump 收集原始 TCP 跟踪。 如果出现权限错误,你可能需要 root,或在命令前面加上前缀 sudo

tcpdump -i [interface] -w trace.pcap

[interface] 替换为要捕获的网络接口。 通常,这与 /dev/eth0 (适用于标准以太网接口)或 /dev/lo0 (对于 localhost 流量)类似。 有关详细信息,请参阅主机系统上的 tcpdump 手册页。

在浏览器中收集网络跟踪

此方法仅适用于基于浏览器的应用。

大多数浏览器开发人员工具都有一个 "网络" 选项卡,该选项卡允许您捕获浏览器和服务器之间的网络活动。 但是,这些跟踪不包括 WebSocket 和服务器发送的事件消息。 如果正在使用这些传输,则使用 Fiddler 或 TcpDump 等工具(如下所述)是更好的方法。

Microsoft Edge 和 Internet Explorer

(对于边缘和 Internet Explorer,说明是相同的)

  1. 按 F12 打开开发工具
  2. 单击 "网络" 选项卡
  3. 刷新页面(如果需要)并重现问题
  4. 单击工具栏中的 "保存" 图标,将跟踪作为 "HAR" 文件导出:

Microsoft Edge 开发工具网络选项卡上的 "保存" 图标

Google Chrome

  1. 按 F12 打开开发工具
  2. 单击 "网络" 选项卡
  3. 刷新页面(如果需要)并重现问题
  4. 右键单击请求列表中的任意位置,然后选择 "另存为包含内容的 HAR":

Google Chrome 开发工具网络选项卡中的 "另存为 HAR 与内容" 选项

Mozilla Firefox

  1. 按 F12 打开开发工具
  2. 单击 "网络" 选项卡
  3. 刷新页面(如果需要)并重现问题
  4. 右键单击请求列表中的任意位置,然后选择 "全部保存为 HAR"

Mozilla Firefox 开发工具网络选项卡中的 "全部保存为 HAR" 选项

将诊断文件附加到 GitHub 问题

可以通过对其进行重命名,将诊断文件附加到 GitHub 问题,以便它们具有 .txt 扩展,然后将其拖放到问题上。

备注

请不要将日志文件或网络跟踪的内容粘贴到 GitHub 问题中。 这些日志和跟踪可能会很大,GitHub 通常会将其截断。

将日志文件拖到 GitHub 问题上

其他资源

上一篇:ASP.NET Core 中的 WebSocket 支持

下一篇:示例和规范

关注微信小程序
程序员编程王-随时随地学编程

扫描二维码
程序员编程王

扫一扫关注最新编程教程