【问题标题】:Why do some logging calls not reach app insights?为什么某些日志记录调用无法达到应用洞察?
【发布时间】:2021-12-23 06:08:46
【问题描述】:

我遇到了一些日志调用未到达 App Insights 但其他的问题

我添加了一个控制器来测试这个

    public class LogController : ControllerBase
    {
        private readonly ILogger<BankingController> _logger;
        private readonly IServiceProvider _services;

        public LogController(ILogger<LogController> logger,
            IServiceProvider services)
        {
            _logger = logger;
            _services = services;
        }

        [HttpGet("test-logging")]
        public async Task TestLogging()
        {
            _logger.Log(LogLevel.Information, "Test Logging controller - information manual");
            _logger.LogTrace("Test Logging controller - trace");
            _logger.LogInformation("Test Logging controller - information");
            _logger.LogWarning("Test Logging controller - warning");
            _logger.LogError("Test Logging controller - error");
            _logger.LogCritical("Test Logging controller - critical");

            var logger = _services.GetRequiredService<ILogger<LoggingController>>();
            logger.Log(LogLevel.Information, "DIRECT Test Logging controller - information manual");
            logger.LogTrace("DIRECT Test Logging controller - trace");
            logger.LogInformation("DIRECT Test Logging controller - information");
            logger.LogWarning("DIRECT Test Logging controller - warning");
            logger.LogError("DIRECT Test Logging controller - error");
            logger.LogCritical("DIRECT Test Logging controller - critical");
        }
    }

此处的日志记录调用均未到达 App Insights

但是,在 API 的另一部分,在 program.cs 中,我们有一个到达 App Insights 的日志记录调用

    public static class IWebHostExtensions
    {
        public static IWebHost MigrateDbContext<TContext>(this IWebHost webHost, Action<TContext,IServiceProvider> seeder) where TContext : DbContext
        {
            using (var scope = webHost.Services.CreateScope())
            {
                var services = scope.ServiceProvider;

                var logger = services.GetRequiredService<ILogger<TContext>>();

                var context = services.GetService<TContext>();

                try
                {
                    logger.LogInformation($"Migrating database associated with context {typeof(TContext).Name}");

                    var retry = Policy.Handle<SqlException>()
                         .WaitAndRetry(new TimeSpan[]
                         {
                             TimeSpan.FromSeconds(3),
                             TimeSpan.FromSeconds(5),
                             TimeSpan.FromSeconds(8),
                         });

                    retry.Execute(() =>
                    {
                        //if the sql server container is not created on run docker compose this
                        //migration can't fail for network related exception. The retry options for DbContext only 
                        //apply to transient exceptions.

                        context.Database.Migrate();
                    });
                  

                    logger.LogInformation($"Migrated database associated with context {typeof(TContext).Name}");
                }
                catch (Exception ex)
                {
                    logger.LogError(ex, $"An error occurred while migrating the database used on context {typeof(TContext).Name}");
                }
            }

            return webHost;
        }
    }

有人遇到过这种情况吗?

我尝试了一个全新的 App Insights 实例

如您所见,用于 logger 的方法使用 ServiceProvider,就像适用于迁移的方法一样

我真的需要正常的 ILogger 约定才能可靠地工作

我正在使用 .NET Core 3.1

在我的 startup.cs 我有

 services.AddApplicationInsightsTelemetry();

我已尝试更改我的 appsettings 中的日志记录级别,但我的自定义消息仍然没有被记录

"Logging": {
    "ApplicationInsights": {
      "LogLevel": {
        "Default": "Trace",
        "Microsoft": "Trace",
        "System": "Trace"
      }
    },
    "LogLevel": {
      "Default": "Information",
      "Microsoft": "Warning",
      "System": "Warning"
    }
  },

保罗

【问题讨论】:

    标签: c# azure logging azure-application-insights


    【解决方案1】:

    您是否尝试过为 ILogger 使用正确的类型?在您的代码中,我可以看到您使用 BankingController 作为 Type 但在不同的类上。试试这个:

    来自:

    public class LogController : ControllerBase
    {
        private readonly ILogger<BankingController> _logger;
    

    到:

    public class LogController : ControllerBase
    {
         private readonly ILogger<LogController > _logger;
    

    【讨论】:

    • 对不起,我在输入问题时错过了我的实际控制人称为银行控制人
    • 我已经更正了问题
    • 还有其他想法吗?我根本想不通
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-08-23
    • 2017-11-10
    • 2018-04-05
    • 2020-04-05
    • 2017-12-07
    • 1970-01-01
    • 2011-06-23
    相关资源
    最近更新 更多