Почему ILogger не регистрируется в приложениях Azure? - PullRequest
1 голос
/ 22 марта 2019

Я тестирую код прямо здесь для консольного приложения: https://docs.microsoft.com/en-us/azure/azure-monitor/app/ilogger#

Я в основном скопировал код и указал его на новый инсайт приложения Azure.Однако ни один из журналов не отображается в приложении.Я что-то упустил?

 static void Main(string[] args)
        {
            // Create DI container.
            IServiceCollection services = new ServiceCollection();

            // Add the logging pipelines to use. We are using Application Insights only here.
            services.AddLogging(loggingBuilder =>
            {
                // Optional: Apply filters to configure LogLevel Trace or above is sent to ApplicationInsights for all
                // categories.
                loggingBuilder.AddFilter<ApplicationInsightsLoggerProvider>("", LogLevel.Trace);
                loggingBuilder.AddApplicationInsights(******);
            });

            // Build ServiceProvider.
            IServiceProvider serviceProvider = services.BuildServiceProvider();

            ILogger<Program> logger = serviceProvider.GetRequiredService<ILogger<Program>>();


            logger.LogCritical("critical message working");
            // Begin a new scope. This is optional. Epecially in case of AspNetCore request info is already
            // present in scope.
            using (logger.BeginScope(new Dictionary<string, object> { { "Method", nameof(Main) } }))
            {
                logger.LogWarning("Logger is working - warning"); // this will be captured by Application Insights.

            }
        }

1 Ответ

2 голосов
/ 22 марта 2019

Код правильный, но вы столкнулись с известной проблемой с приложениями ApplicationInsights и Console - приложение умирает до того, как ApplicationInsights может отправить данные бэкэнду.(данные отправляются не сразу, а пакетируются и отправляются с интервалами.)

Добавление периода ожидания ~ 30 секунд должно помочь вашему делу.Thread.Sleep (31000);

В обычных консольных приложениях документы предлагают выполнять явную очистку.https://docs.microsoft.com/en-us/azure/azure-monitor/app/console#full-example

Но в случае ILogger вы не управляете экземпляром TelemetryClient.Таким образом, ваша лучшая альтернатива - контролировать канал и вызывать сброс на канале, после чего следует небольшой сон.Модифицированный код приведен ниже.

class Program
    {
        static void Main(string[] args)
        {
            // Create DI container.
            IServiceCollection services = new ServiceCollection();

            var channel = new InMemoryChannel();

            services.Configure<TelemetryConfiguration>(
              (config) =>
                {
                    config.TelemetryChannel = channel;                    
                }
           );

            // Add the logging pipelines to use. We are using Application Insights only here.
            services.AddLogging(loggingBuilder =>
            {
                // Optional: Apply filters to configure LogLevel Trace or above is sent to ApplicationInsights for all
                // categories.
                loggingBuilder.AddFilter<ApplicationInsightsLoggerProvider>("", LogLevel.Trace);
                loggingBuilder.AddApplicationInsights("***");
            });

            // Build ServiceProvider.
            IServiceProvider serviceProvider = services.BuildServiceProvider();

            ILogger<Program> logger = serviceProvider.GetRequiredService<ILogger<Program>>();


            logger.LogCritical("critical message working");
            // Begin a new scope. This is optional. Epecially in case of AspNetCore request info is already
            // present in scope.
            using (logger.BeginScope(new Dictionary<string, object> { { "Method", nameof(Main) } }))
            {
                logger.LogWarning("Logger is working - warning"); // this will be captured by Application Insights.

            }

            channel.Flush();
            Thread.Sleep(1000);            
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...