【问题标题】:How to "flush" ApplicationInsightsTraceListener, in a Console Application, on exit?如何在退出时在控制台应用程序中“刷新”ApplicationInsightsTraceListener?
【发布时间】:2018-12-13 18:31:36
【问题描述】:

我有一个较旧的控制台应用程序,我正在尝试使用 ApplicationInsightsTraceListener 切换跟踪以使用 Application Insights。

如果没有在结尾添加任意睡眠,我无法获取日志的结尾。

我重新创建了一个非常简单的控制台应用程序,如下所示:

    static void Main(string[] args)
    {
        Trace.TraceInformation("Hello World!");
        Thread.Sleep(10000);
    }

有了Sleep我可以看到它,没有我不能。

我尝试了几种不同的变体来代替睡眠,例如

        System.Diagnostics.Trace.Flush();

        Microsoft.ApplicationInsights.Extensibility.TelemetryConfiguration.Active.TelemetryChannel.Flush();

我正在使用开箱即用的 ApplicationInsights.config(我的 Instrumentation Key 除外。)

这是packages.config:

<?xml version="1.0" encoding="utf-8"?>
<packages>
  <package id="Microsoft.ApplicationInsights" version="2.8.1" targetFramework="net472" />
  <package id="Microsoft.ApplicationInsights.Agent.Intercept" version="2.4.0" targetFramework="net472" />
  <package id="Microsoft.ApplicationInsights.DependencyCollector" version="2.8.1" targetFramework="net472" />
  <package id="Microsoft.ApplicationInsights.PerfCounterCollector" version="2.8.1" targetFramework="net472" />
  <package id="Microsoft.ApplicationInsights.TraceListener" version="2.8.1" targetFramework="net472" />
  <package id="Microsoft.ApplicationInsights.WindowsServer" version="2.8.1" targetFramework="net472" />
  <package id="Microsoft.ApplicationInsights.WindowsServer.TelemetryChannel" version="2.8.1" targetFramework="net472" />
  <package id="System.Diagnostics.DiagnosticSource" version="4.5.0" targetFramework="net472" />
</packages>

更新

通过以这样的代码块结尾,我提高了交付的可靠性,但我仍然不喜欢睡觉。就此而言,我不喜欢我需要为新的跟踪侦听器修改代码,但我怀疑我是否能摆脱这种情况。

var channel = Microsoft.ApplicationInsights.Extensibility.TelemetryConfiguration.Active.TelemetryChannel as ServerTelemetryChannel;
channel.MaxTelemetryBufferDelay = TimeSpan.FromSeconds(.5);
Thread.Sleep(channel.MaxTelemetryBufferDelay);

【问题讨论】:

  • 唯一对我们有用的是在程序末尾添加Thread.Sleep(45000);。不是一个很好的解决方案,但它修复了我们所有的控制台应用程序。

标签: c# .net azure console-application azure-application-insights


【解决方案1】:

很遗憾,目前没有好的解决方案。仅在所有数据被持久化后才返回的 Flush 请求位于 backlog

一种选择是将遥测通道替换为 InMemoryChannel。然后 Flush 将保证数据发送到端点。但如果端点不可用,此通道不会重试,因此仍有可能丢失数据。

另一种选择是提供自己的遥测通道。但这可能需要大量工作才能使其可靠。

当控制台应用返回时,ServerTelemetryChannel 将重新发送数据。不确定它是否对您的方案有帮助。

【讨论】:

  • 谢谢。这就是我所发现的,尽管实际上我从来没有让 ServerTelemetryChannel 在控制台应用程序返回时重新发送数据。
  • 一个选项 - 在 github 上打开一个新问题,不为控制台应用程序重新发送数据。团队将进行调查。
猜你喜欢
  • 1970-01-01
  • 2014-10-26
  • 2014-02-17
  • 1970-01-01
  • 2013-08-04
  • 1970-01-01
  • 2011-06-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多