как отличить трассировки от разных экземпляров .net основного приложения в Application Insights - PullRequest
0 голосов
/ 20 декабря 2018

Я работаю в консольном приложении .NET Core 2.2, которое использует Microsoft.Extensions.Logging и настроено на отправку журналов в Azure Application Insights с использованием Microsoft.ApplicationInsights.Extensibility с помощью:

   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

Но в моем случае я не вижу свойства "FileName" в Application Insights.

Ответы [ 2 ]

0 голосов
/ 21 декабря 2018

Для консольного проекта, если вы хотите использовать пользовательский ITelemetryInitializer, вы должны использовать этот формат: .TelemetryInitializers.Add(new CustomInitializer());

Официальный документ здесь .

Iпроверить это на моей стороне, и это работает.Можно установить имя роли.

Пример кода приведен ниже:

        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

0 голосов
/ 20 декабря 2018

Если вы действительно не можете их различить, вы можете использовать пользовательский инициализатор телеметрии , например, так:

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>();
...