zoukankan      html  css  js  c++  java
  • 【Azure 应用服务】App Service .NET Core项目在Program.cs中自定义添加的logger.LogInformation,部署到App Service上后日志不显示Log Stream中的问题

    问题描述

    在.Net Core 5.0 项目中,添加 Microsoft.Extensions.Logging.AzureAppServices 和 Microsoft.Extensions.Logging.Abstractions插件后,需要在构建Host的代码中添加  logging.AddAzureWebAppDiagnostics() 。

        return Host.CreateDefaultBuilder(args)
                    .ConfigureLogging(logging =>
                    {
                        //logging.AddConsole();
                        logging.AddAzureWebAppDiagnostics();
                    })

    然后 初始化Logger对象,添加 Console方式输出日志( var _logger = LoggerFactory.Create(builder => builder.AddConsole()).CreateLogger<Program>();

    全部代码为:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Threading.Tasks;
    using Microsoft.AspNetCore.Builder;
    using Microsoft.AspNetCore.Hosting;
    using Microsoft.AspNetCore.Http;
    using Microsoft.Extensions.Configuration;
    using Microsoft.Extensions.Hosting;
    using Microsoft.Extensions.Logging;
    
    namespace hellodotnetcore
    {
        public class Program
        {
            public static void Main(string[] args)
            {
                CreateHostBuilder(args).Build().Run();
            }
    
    
            public static IHostBuilder CreateHostBuilder(string[] args)
            {
                 var _logger = LoggerFactory.Create(builder => builder.AddConsole()).CreateLogger<Program>();
                //初始化当前Host实例时候随机生成一个GUID,用于在此后的请求中判断当前时候是否被标记为健康,非健康,回收。
                var instance = Guid.NewGuid();
                //firstFailure来记录第一个失败请求所进入当前实例的时间,firstFailure保存在内存中
                DateTime? firstFailure = null;
                //ILogger _logger = null;
    
                return Host.CreateDefaultBuilder(args)
                    .ConfigureLogging(logging =>
                    {
                        //logging.AddConsole();
                        logging.AddAzureWebAppDiagnostics();
                    })
                    .ConfigureWebHostDefaults(webBuilder =>
                    webBuilder.Configure(configureApp =>
                    configureApp.Run(async context =>
                    {
                        _logger.LogInformation("TEST THE SELF LOG INFORMATION...");
    
                        _logger.LogError("TEST THE SELF LOG ERROR...");
    
                        _logger.LogDebug("TEST THE SELF LOG Debug...");
    
                        _logger.LogTrace("TEST THE SELF LOG Trace...");
    
                        _logger.LogWarning("TEST THE SELF LOG Warning...");//当请求URL为fail时候,认为设置返回状态为500,告诉App Service的Health Check功能,当前实例出现故障。
                        if (firstFailure == null && context.Request.Path.Value.ToLower().Contains("fail"))
                        {
                            firstFailure = DateTime.UtcNow;
                        }
    
                        if (context.Request.Path.Value.ToLower().Contains("exception"))
                        {
                            throw new Exception("this is custom exception for logging ...");
    
                        }
    
                        if (firstFailure != null)
                        {
                            context.Response.StatusCode = 500;
                            context.Response.ContentType = "text/html; charset=utf-8";
                            await context.Response.WriteAsync(
                               $"当前实例的GUID为 {instance}.
    <br>" +
                                $"这个实例最早出现错误的时间是 {firstFailure.Value}. 当前时间为是{DateTime.UtcNow}
    
    <br><br>" +
                                $"根据文档的描述 https://docs.microsoft.com/en-us/azure/app-service/monitor-instances-health-check, 如果一个实例在一直保持unhealthy状态一小时,它将会被一个新实例所取代
    
    <br>" +
                                $"According to https://docs.microsoft.com/en-us/azure/app-service/monitor-instances-health-check, If an instance remains unhealthy for one hour, it will be replaced with new instance.<br>");
                        }
                        else
                        {
                            context.Response.StatusCode = 200;
                            context.Response.ContentType = "text/html; charset=utf-8";
                            await context.Response.WriteAsync($"当前实例的GUID为 {instance}.
    <br>" +
                                $"此实例报告显示一切工作正常.");
                        }
                    })));
            }
        }
    }

    在本地通过dotnet run测试发现,访问 http://localhost:5000/ 和 http://localhost:5000/exception 就可以看见在代码中的加入的日志信息,达到期望。

    但是把代码发布到Azure App Service后,通过Log Stream发现,却没有观察到 _logger 日志:

    _logger.LogInformation("TEST THE SELF LOG INFORMATION...");

    _logger.LogError("TEST THE SELF LOG ERROR...");

    _logger.LogDebug("TEST THE SELF LOG Debug...");

    _logger.LogTrace("TEST THE SELF LOG Trace...");

    _logger.LogWarning("TEST THE SELF LOG Warning...");

    App Service 中查看Docker中运行应用的日志:

    问题解决

    这是因为App Service没有启用App Service Logs. 当在门户上启用后,在此查看Log Stream文件信息,就可以看见和本地同样的日志信息:

    参考资料

    为 Azure 应用服务配置 ASP.NET 应用: https://docs.azure.cn/zh-cn/app-service/configure-language-dotnet-framework#access-diagnostic-logs


    'ILoggerFactory' does not contain a definition for 'AddConsole': https://stackoverflow.com/questions/58259520/iloggerfactory-does-not-contain-a-definition-for-addconsole

    There is a seperate issue at play, previously the signature for AddConsole() expected an ILoggerFactory, that has since changed to an ILoggerBuilder, as hinted at in the error message.

    The following it seems is the new way to stand up a new Console logger:

    var loggerFactory = LoggerFactory.Create(builder => builder.AddConsole());

    当在复杂的环境中面临问题,格物之道需:浊而静之徐清,安以动之徐生。 云中,恰是如此!

  • 相关阅读:
    江湖盛传“阿里三板斧”,其实这才是全部真相!
    PHP算法之四大基础算法
    PHP实现的毫秒定时器,同时解决进程不重复堆积
    leetcode小题解析
    PHP算法之二分查找
    elastic学习笔记
    php中mysqli 处理查询结果集总结
    PHP中的 Iterator 与 Generator
    Laravel源码解析之反射的使用
    PHP下的异步尝试四:PHP版的Promise
  • 原文地址:https://www.cnblogs.com/lulight/p/15182804.html
Copyright © 2011-2022 走看看