MiniProfiler - 在控制台应用程序中复制 Web 视图信息
MiniProfiler - Replicate web view information in a console app
在控制台应用程序中使用 mini-profiler 时,是否可以获得与在 Web 应用程序中使用时相同级别的信息?理想情况下,我只想在控制台中自行托管网络 UI,但看起来这不可能。
我的主要目标是获取正在执行的 sqlqueries as/when 调用及其 parameters/run 时间。我已经尝试过 RenderPlainText() 解决方案,它远没有 webview 那么详细,而且似乎没有一个钩子可以用来在发生有趣的事情时记录它的内容。
没有内置的方法来获得完整的基于文本的探查器输出(RenderPlainText()
是盒子里的东西),因为人们似乎都需要各种复杂的数据。但是有几个选择!您可以:
- 通过抓取时间手动渲染分析器输出。如果您只想要查询列表,您可以遍历所有查询级别的时间并打印出它们的自定义时间。这听起来很不祥,因为它是一棵树,但是有
profiler.GetTimingHierarchy()
可用于将它们全部作为列表获取,例如:
var profiler = MiniProfiler.StartNew();
using (profiler.Step("MyStep"))
using (profiler.CustomTiming("sql", "Select *"))
{
// Stuff
}
profiler.Stop();
foreach (var timing in profiler.GetTimingHierarchy())
{
if (timing.HasCustomTimings)
{
foreach (var timingType in timing.CustomTimings)
{
Console.WriteLine(timingType.Key + " queries:");
foreach (var queryTiming in timingType.Value)
{
Console.WriteLine($" {queryTiming.DurationMilliseconds} ms - {queryTiming.CommandString}");
}
}
}
}
这会产生:
sql queries:
0.9 ms - Select *
- 或者,更复杂的是,为分析器使用共享存储,并在任何地方的 Web 应用程序中查看它们。例如,如果您将控制台应用程序设置为存储在 Redis 中(默认情况下在内存中),那么您可以将网络应用程序指向同一存储并使用网络 UI 来查看它们。您只需要确保您的“用户”ID 匹配。那是选项上的
.UserIdProvider
(默认为 Web 端的 IP 地址)。例如,在 ASP.NET 核心:
services.AddMiniProfiler(options =>
{
options.UserIdProvider = request => MyGetUserIdFunction(request);
});
使用第二个选项时,请注意 URL 是一致的,如果您从 MiniProfiler 网络 UI 单击“共享”,则所有变化的只是 GUID。您可以使用当前的 profiler.Id
并使用它向您的控制台吐出一个方便的 link。
在控制台应用程序中使用 mini-profiler 时,是否可以获得与在 Web 应用程序中使用时相同级别的信息?理想情况下,我只想在控制台中自行托管网络 UI,但看起来这不可能。
我的主要目标是获取正在执行的 sqlqueries as/when 调用及其 parameters/run 时间。我已经尝试过 RenderPlainText() 解决方案,它远没有 webview 那么详细,而且似乎没有一个钩子可以用来在发生有趣的事情时记录它的内容。
没有内置的方法来获得完整的基于文本的探查器输出(RenderPlainText()
是盒子里的东西),因为人们似乎都需要各种复杂的数据。但是有几个选择!您可以:
- 通过抓取时间手动渲染分析器输出。如果您只想要查询列表,您可以遍历所有查询级别的时间并打印出它们的自定义时间。这听起来很不祥,因为它是一棵树,但是有
profiler.GetTimingHierarchy()
可用于将它们全部作为列表获取,例如:
var profiler = MiniProfiler.StartNew();
using (profiler.Step("MyStep"))
using (profiler.CustomTiming("sql", "Select *"))
{
// Stuff
}
profiler.Stop();
foreach (var timing in profiler.GetTimingHierarchy())
{
if (timing.HasCustomTimings)
{
foreach (var timingType in timing.CustomTimings)
{
Console.WriteLine(timingType.Key + " queries:");
foreach (var queryTiming in timingType.Value)
{
Console.WriteLine($" {queryTiming.DurationMilliseconds} ms - {queryTiming.CommandString}");
}
}
}
}
这会产生:
sql queries:
0.9 ms - Select *
- 或者,更复杂的是,为分析器使用共享存储,并在任何地方的 Web 应用程序中查看它们。例如,如果您将控制台应用程序设置为存储在 Redis 中(默认情况下在内存中),那么您可以将网络应用程序指向同一存储并使用网络 UI 来查看它们。您只需要确保您的“用户”ID 匹配。那是选项上的
.UserIdProvider
(默认为 Web 端的 IP 地址)。例如,在 ASP.NET 核心:
services.AddMiniProfiler(options =>
{
options.UserIdProvider = request => MyGetUserIdFunction(request);
});
使用第二个选项时,请注意 URL 是一致的,如果您从 MiniProfiler 网络 UI 单击“共享”,则所有变化的只是 GUID。您可以使用当前的 profiler.Id
并使用它向您的控制台吐出一个方便的 link。