为什么ILogger没有登录到Azure应用洞察?

问题描述 投票:1回答:1

我正在测试代码直接来自这里的控制台应用程序:https://docs.microsoft.com/en-us/azure/azure-monitor/app/ilogger#

我基本上复制了代码并将其指向新的天蓝色应用洞察实例。但是,没有任何日志显示在应用洞察中。我错过了什么吗?

 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.

            }
        }
c# .net azure .net-core azure-application-insights
1个回答
2
投票

代码是正确的,但是你遇到了ApplicationInsights和Console应用程序的已知问题 - 应用程序在ApplicationInsights可以将数据发送到后端之前就已经死了。 (数据不会立即发送,而是按时间间隔进行批处理。)

添加约30秒的睡眠应该有助于你的情况。 Thread.sleep代码(31000);

在常规控制台应用程序中,文档建议进行显式刷新。 https://docs.microsoft.com/en-us/azure/azure-monitor/app/console#full-example

但在ILogger案例中,您无法控制TelemetryClient实例。因此,您最好的选择是控制频道,并在频道上调用flush,然后进行小睡眠。修改后的代码如下。

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);            
        }
    }
© www.soinside.com 2019 - 2024. All rights reserved.