本文提供從 ASP.NET Core SignalR 應用收集診斷信息以幫助解決問題的指南。
服務器端日志記錄
警告
服務器端日志可能包含來自應用的敏感信息。 切勿將來自生產應用的原始日志發布到 GitHub 等公共論壇。
SignalR 是 ASP.NET Core 的一部分,因此它使用 ASP.NET Core 日志記錄系統。 在默認配置中,SignalR 只記錄很少的信息,但這可以進行配置。 有關配置 ASP.NET Core 日志記錄的詳細信息,請參閱 ASP.NET Core 日志記錄上的文檔。
SignalR 使用兩個記錄器類別:
若要啟用來自 SignalR 的詳細日志,請通過在 Logging 的 子節中添加以下項目,在 .json 文件中將上述的兩個前綴配置為 Debug 級別:
{
"Logging": {
"LogLevel": {
"Default": "Debug",
"System": "Information",
"Microsoft": "Information",
"Microsoft.AspNetCore.SignalR": "Debug",
"Microsoft.AspNetCore.Http.Connections": "Debug"
}
}
}
還可以在 方法中通過代碼配置此項:
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();
如果未使用基于 JSON 的配置,請在配置系統中設置以下配置值:
查看配置系統的文檔以確定如何指定嵌套的配置值。 例如,使用環境變量時,使用兩個 _ 而不是 : 字符(例如 ..SignalR)。
建議在為應用收集更詳細的診斷時使用 Debug 級別。 Trace 級別產生的診斷級別很低,且很少需要它來診斷應用中的問題。
訪問服務器端日志
訪問服務器端日志的方式取決于在其中運行的環境。
作為 IIS 外部的控制臺應用
如果在控制臺應用中運行,則默認情況下應啟用。 SignalR 日志將顯示在控制臺中。
在 Visual Studio 的 IIS Express 中
Visual Studio 在“輸出”窗口中顯示日志輸出。 選擇“ASP.NET Core Web 服務器”下拉選項。
Azure 應用服務
在 Azure 應用服務門戶的“診斷日志”部分中啟用“應用程序日志記錄()”選項,并將級別配置為 Verbose。 日志應可從日志流式處理服務和應用服務文件系統的日志中獲取。 有關詳細信息,請參閱 。
其他環境
如果將應用部署到另一個環境(例如 Docker、 或 Windows 服務),請參閱 .NET Core 和 ASP.NET Core 中的日志記錄,了解有關如何配置適用于環境的日志記錄提供程序的詳細信息。
客戶端日志記錄
警告
客戶端日志可能包含來自應用的敏感信息。 切勿將來自生產應用的原始日志發布到 GitHub 等公共論壇。
使用 客戶端時,可以使用 上的 方法配置日志記錄選項:
let connection = new signalR.HubConnectionBuilder()
.withUrl("/my/hub/url")
.configureLogging(signalR.LogLevel.Debug)
.build();
若要禁用框架日志記錄,請在 方法中指定 signalR..None。 請注意,某些日志記錄由瀏覽器直接發出,無法通過設置日志級別禁用。
下表顯示了可用于 客戶端的日志級別。 將日志級別設置為其中一個值,便可以在該表的該級別及其以上所有級別進行日志記錄。
Level說明
None
不記錄任何消息。
指示整個應用失敗的消息。
Error
指示當前操作失敗的消息。
Warning
指示非嚴重問題的消息。
信息性消息。
Debug
對調試有幫助的診斷消息。
Trace
用于診斷特定問題的非常詳細的診斷消息。
配置詳細程度后,日志將寫入瀏覽器控制臺(或 NodeJS 應用中的標準輸出)。
如果要將日志發送到自定義日志記錄系統,可以提供實現 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 客戶端獲取日志,可以對 使用 方法。 其工作方式與對 和 使用 方法相同。 可以配置與在 ASP.NET Core 中使用的相同日志記錄提供程序。 但是,必須為單個日志記錄提供程序手動安裝和啟用 NuGet 包。
若要將 .NET 客戶端日志記錄添加到 Blazor 應用,請參閱 。
控制臺日志記錄
若要啟用控制臺日志記錄,請添加 包。 然后,使用 方法配置控制臺記錄器:
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 中的“輸出”窗口。 安裝 ..Logging.Debug 包并使用 方法:
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 或與 ..Logging 集成的任何其他日志記錄系統。 如果日志記錄系統提供 ,可以使用 注冊它:
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 跟蹤。 從 /fiddler 安裝并啟動該工具,然后運行你的應用程序,重現此問題。 Fiddler 適用于 Windows,并且提供適用于 macOS 和 Linux 的 beta 版本。
如果使用 HTTPS 進行連接,則需執行一些額外的步驟來確保 Fiddler 可以解密 HTTPS 流量。 有關詳細信息,請參閱 Fiddler 文檔。
收集了跟蹤后,可以通過從菜單欄中選擇“文件”>“保存”>“所有會話”來導出跟蹤。
使用 tcpdump 收集網絡跟蹤(僅限 macOS 和 Linux)
此方法適用于所有應用程序。
可以使用 tcpdump 收集原始 TCP 跟蹤,具體方法是在命令行界面中運行以下命令。 如果出現權限錯誤,你可能需要 root 權限或為命令添加前綴 sudo:
tcpdump -i [interface] -w trace.pcap
將 [] 替換為要捕獲的網絡接口。 通常,這類似于 /dev/eth0(對于標準以太網接口)或 /dev/lo0(對于 流量)。 有關詳細信息,請參閱主機系統上的 tcpdump 手冊頁。
在瀏覽器中收集網絡跟蹤
此方法僅適用于基于瀏覽器的應用。
大多數瀏覽器開發人員工具控制臺都有一個“網絡”選項卡,可用于捕獲瀏覽器和服務器之間的網絡活動。 但是,這些跟蹤不包括 和服務器發送的事件消息。 如果使用這些傳輸方式,使用 Fiddler 或 TcpDump(下文所述)等工具是一種更好的方法。
Edge 和
(適用于 Edge 和 的說明是相同的)
按 F12 打開開發工具單擊“網絡”選項卡如果需要,請刷新頁面,并重現此問題單擊工具欄中的“保存”圖標,將跟蹤導出為“HAR”文件:
Google Chrome按 F12 打開開發工具單擊“網絡”選項卡如果需要,請刷新頁面,并重現此問題右鍵單擊請求列表中的任意位置,然后選擇“另存為帶內容的 HAR”:
Mozilla Firefox按 F12 打開開發工具單擊“網絡”選項卡如果需要,請刷新頁面,并重現此問題右鍵單擊請求列表中的任意位置,然后選擇“全部保存為 HAR”
將診斷文件附加到 GitHub 問題
可以通過重命名診斷文件來將其附加到 GitHub 問題,以便它們具有 .txt 擴展名,然后將它們拖放到問題上。
注意
請不要將日志文件或網絡跟蹤的內容粘貼到 GitHub 問題。 這些日志和跟蹤可能非常大,并且 GitHub 通常會截斷它們。
指標
指標是一段時間的數據度量值的表示形式。 例如每秒的請求數。 使用指標數據可以在高級別觀察應用的狀態。 .NET gRPC 指標是使用 發出的。
SignalR 服務器指標
SignalR 服務器指標在 ..Http. 事件源上報告。
名稱說明
-started
已啟動的連接總數
-stopped
已停止的連接總數
-timed-out
已超時的連接總數
current-
當前連接數
-
平均連接持續時間
觀察指標
dotnet- 是一個性能監視工具,用于臨時運行狀況監視和初級性能調查。 使用 ..Http. 作為提供程序名稱監視 .NET 應用。 例如:
> 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
其他資源
*請認真填寫需求信息,我們會在24小時內與您取得聯系。