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开发中处理emoji表情和颜文字的兼容问题
    red入门学习笔记
    面向对象的三个基本特征(讲解)
    详解Ajax请求(四)——多个异步请求的执行顺序
    ASP.NET MVC模型绑定的6个建议,徐汇区网站设计 狼人:
    2010年度报告:是谁在编写Linux内核? 狼人:
    Kataspace:用HTML5和WebGL创建基于浏览器的虚拟世界 狼人:
    .NET Micro Framework 4.2 RC2发布!,徐汇区网站设计 狼人:
    SilveOS:基于Silverlight的Web操作系统,徐汇区网站设计 狼人:
    年轻人,你着什么急? 狼人:
  • 原文地址:https://www.cnblogs.com/lulight/p/15182804.html
Copyright © 2011-2022 走看看