使用Microsoft.ApplicationInsights.NLogTarget

时间:2018-03-27 13:47:46

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

目标:将日志条目从NLog转发到Azure Application Insights。从:https://github.com/Microsoft/ApplicationInsights-dotnet-logging

开始

我创建了一个非常基本的控制台应用程序:

TelemetryConfiguration.Active.InstrumentationKey = "my instrumentation key";

Logger logger = LogManager.GetLogger("Example");
logger.Info("Hello World");

Console.ReadLine();

使用以下app.config:

<configuration>
  <configSections>
    <section name="nlog" type="NLog.Config.ConfigSectionHandler, NLog" />
  </configSections>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.1" />
  </startup>
  <nlog xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" throwExceptions="true">
    <extensions>
      <add assembly="Microsoft.ApplicationInsights.NLogTarget" />
    </extensions>
    <targets>
      <target type="ApplicationInsightsTarget" name="aiTarget" layout="${longdate} ${level} ${threadid} ${logger} ${message} ${exception:format=ToString}" />
      <target name="console" xsi:type="ColoredConsole" layout="${longdate} ${level} ${threadid} ${logger} ${message} ${exception:format=ToString}" />
    </targets>
    <rules>
      <logger name="*" minlevel="Trace" writeTo="aiTarget" />
      <logger name="*" minlevel="Trace" writeTo="console" />
    </rules>
  </nlog>
</configuration>

但是,当ColoredConsole目标按预期工作时,Azure Application Insights中没有日志消息。只有在我拨打TelemetryConfiguration.Active.TelemetryChannel.Flush();时,邮件才会到达。

  • 我是否犯了配置错误?
  • 我需要自己调用.Flush()吗?

1 个答案:

答案 0 :(得分:3)

在客户端将数据发送到门户之前,会对缓存项进行缓冲(默认情况下为30秒,请参阅the source code)。因此,您必须至少保持控制台打开一段时间或手动拨打Flush()或将developer mode设置为true:

TelemetryConfiguration.Active.TelemetryChannel.DeveloperMode = true;

修改 可以使用多个渠道,例如InMemoryChannelServerTelemetryChannel。它们都有30秒的默认缓冲区间隔。

InMemoryChannel例如有一个公共属性TimeSpan SendingInterval,所以如果你将TelemetryConfiguration.Active.TelemetryChannel强制转换为实际的实现,你应该能够改变缓冲区间隔。

请参阅ServerTelemetryChannel.MaxTelemetryBufferDelayInMemoryChannel.SendingInterval