如何从Application Insights中区分跟踪与不同实例.net核心应用程序

时间:2018-12-20 09:57:12

标签: logging .net-core azure-application-insights

我在使用Microsoft.Extensions.Logging的.NET Core 2.2控制台应用程序上工作,并配置为使用Microsoft.ApplicationInsights.Extensibility通过以下方式将日志发送到Azure Application Insights:

   services.AddSingleton(x =>
                new TelemetryClient(
                    new TelemetryConfiguration
                    {
                        InstrumentationKey = "xxxx"
                    }));  
...                 
   var loggerFactory = serviceProvider.GetService<ILoggerFactory>();
   loggerFactory.AddApplicationInsights(serviceProvider, logLevel);

工作正常:我可以在Application Insights中读取日志。但是可以在少数情况下(在不同的Docker容器中)同时启动应用程序。如何区分不同实例的痕迹?我可以使用源FileName,但是我不知道如何注入它。

我尝试使用Scope:

var logger = loggerFactory.CreateLogger<Worker>();                
logger.BeginScope(dto.FileName);
logger.LogInformation($"Start logging.");

有趣的是,我的配置几乎与示例相同:https://github.com/MicrosoftDocs/azure-docs/issues/12673

但是在我的情况下,我在Application Insights中看不到属性“ FileName”。

2 个答案:

答案 0 :(得分:1)

如果您真的无法区分它们,则可以使用custom telemetry initializer,如下所示:

public class CustomInitializer : ITelemetryInitializer
{
    public void Initialize(ITelemetry telemetry)
    {
        telemetry.Context.Cloud.RoleName = Environment.MachineName;
    }
}

和/或您可以添加自定义属性:

public class CustomInitializer : ITelemetryInitializer
{
    public void Initialize(ITelemetry telemetry)
    {
        if(telemetry is ISupportProperties)
        {
            ((ISupportProperties)telemetry).Properties["MyIdentifier"] = Environment.MachineName;
        }
    }
}

在此示例中,我使用了Environment.MachineName,但是如果需要,您当然可以使用其他东西。就像您的工作ID参数一样。

使用以下方法将其连接起来

services.AddSingleton<ITelemetryInitializer, CustomInitializer>();

答案 1 :(得分:1)

对于控制台项目,如果要使用自定义ITelemetryInitializer,则应使用以下格式:.TelemetryInitializers.Add(new CustomInitializer());

官方文档是here

我在我身边进行测试,并且可以正常工作。可以设置角色名称。

示例代码如下:

        static void Main(string[] args)
        {
            TelemetryConfiguration configuration = TelemetryConfiguration.CreateDefault();
            configuration.InstrumentationKey = "xxxxx";
            configuration.TelemetryInitializers.Add(new CustomInitializer());

            var client = new TelemetryClient(configuration);

            ServiceCollection services = new ServiceCollection();
            services.AddSingleton(x => client);
            var provider = services.BuildServiceProvider();

            var loggerFactory = new LoggerFactory();

            loggerFactory.AddApplicationInsights(provider, LogLevel.Information);

            var logger = loggerFactory.CreateLogger<Program>();
            logger.LogInformation("a test message 111...");



            Console.WriteLine("Hello World!");
            Console.ReadLine();
        }

在azure门户中检查角色名称:

enter image description here