2016-08-23 62 views
1

我在我的WPF應用程序和NLog中使用Microsoft Application Insights來記錄異常和調試信息。所以,我將Application Insights NLog Target添加到了應用程序中。但是,此NLog目標記錄的所有事件不包含Azure門戶上的上下文數據。如何爲應用程序洞察設置上下文NLog目標

使用TelemetryClient記錄的其他事件包含這些數據。

var telemetryClient = new TelemetryClient(); 
     telemetryClient.InstrumentationKey = "xxx"; 
     telemetryClient.Context.User.Id = Environment.UserName; 
     telemetryClient.Context.Session.Id = Guid.NewGuid().ToString(); 

     //var config = new LoggingConfiguration(); 
     ConfigurationItemFactory.Default.Targets.RegisterDefinition(
        "ai", 
        typeof(ApplicationInsightsTarget) 
       ); 

     ApplicationInsightsTarget aiTarget = new ApplicationInsightsTarget(); 
     aiTarget.InstrumentationKey = "xxx"; 
     aiTarget.Name = "ai"; 
     LogManager.Configuration.AddTarget("ai", aiTarget); 

     LogManager.Configuration.AddRule(LogLevel.Info, LogLevel.Info, aiTarget); 

     LogManager.Configuration.Reload(); 
     LogManager.ReconfigExistingLoggers(); 

我的問題是 - 有可能使用這個上下文數據也用於由NLog Target記錄的事件嗎?或者,我怎樣才能爲NLog設置上下文數據?

回答

1

您可以使用TelemetryInitializer來確保所有創建的項目獲得所需的上下文?

修改實例來源: http://apmtips.com/blog/2014/12/01/telemetry-initializers/

namespace ApmTips.Tools 
{ 
    using Microsoft.ApplicationInsights.Extensibility; 
    using Microsoft.Diagnostics.Tracing; 
    using System.Diagnostics; 

    public class ExtendedIDTelemetryInitializer : ITelemetryInitializer 
    { 
     public void Initialize(Microsoft.ApplicationInsights.Channel.ITelemetry telemetry) 
     { 
      telemetry.Context.[some field] = [some value]; 
     } 
    } 
} 

,你還需要註冊一個初始化等,並在上面的職位說明,有幾種方法可以做到這一點。

(但不使用ContextInitializer,它是從什麼,你會覺得它名不副實)和: http://apmtips.com/blog/2015/06/09/do-not-use-context-initializers/