如何在退出时在控制台应用程序中“刷新” ApplicationInsightsTraceListener?

时间:2018-12-13 18:31:36

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

我有一个较旧的控制台应用程序,我正在尝试将跟踪切换为通过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);

1 个答案:

答案 0 :(得分:2)

不幸的是,目前没有好的解决方案。仅在所有数据都保留之后才返回的刷新请求位于backlog中。

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

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

ServerTelemetryChannel将在控制台应用程序返回时重新发送数据。不确定是否对您的情况有帮助。