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。