1

在控制台应用程序中使用迷你分析器时,是否可以从 Web 应用程序中获得相同级别的信息?理想情况下,我只想在控制台中自行托管 Web UI,但这看起来不太可能。

我的主要目标是获取在调用时执行的 sqlqueries 及其参数/运行时间。我已经尝试过 RenderPlainText() 解决方案,它远不如 webview 详细,而且似乎没有一个钩子可以用来在发生有趣的事情时记录其内容。

4

1 回答 1

3

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 *
  • 或者,更复杂的是,为分析器使用共享存储并在任何地方的网络应用程序中查看它们。例如,如果您将控制台应用程序设置为存储在 Redis 中(默认为内存中),那么您可以将 Web 应用程序指向相同的存储空间并使用 Web UI 来查看它们。您只需要确保您的“用户”ID 匹配。这是.UserIdProvideron 选项(默认为网页端的 IP 地址)。例如,在 ASP.NET Core 中:
services.AddMiniProfiler(options =>
{
   options.UserIdProvider = request => MyGetUserIdFunction(request);
});

使用第二个选项时,请注意,如果您从 MiniProfiler Web UI 中单击“共享”,则 URL 是一致的,并且所有发生变化的只是 GUID。您可以获取当前profiler.Id并使用它来吐出一个方便的链接到您的控制台。

于 2020-06-26T22:27:13.413 回答