【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}.\n<br>" + $"这个实例最早出现错误的时间是 {firstFailure.Value}. 当前时间为是{DateTime.UtcNow}\n\n<br><br>" + $"根据文档的描述 https://docs.microsoft.com/en-us/azure/app-service/monitor-instances-health-check, 如果一个实例在一直保持unhealthy状态一小时,它将会被一个新实例所取代\n\n<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}.\n<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());
当在复杂的环境中面临问题,格物之道需:浊而静之徐清,安以动之徐生。 云中,恰是如此!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
2020-08-24 【应用服务 App Service】NodeJS +Egg 发布到App Service时遇见 [ERR_SYSTEM_ERROR]: A system error occurred:uv_os_get_passwd returned ENOENT(no such file or directory)