一个 ASP.NET Core 应用因为启动时发生异常造成容器无法启动,却没有任何错误信息输出,尝试在 Program.cs 中用下面的代码将未处理异常输出到控制台
AppDomain.CurrentDomain.UnhandledException += (object sender, UnhandledExceptionEventArgs e) =>
{
if (e.IsTerminating && e.ExceptionObject is Exception ex)
{
Console.WriteLine(ex);
}
};
但控制台依然无任何输出,请问如何解决这个问题?
首先得确定异常发生在什么地方? 如果是用户代码 UnhandledException 还能抓到.
如果是更底层的异常, 在docker run 的时候能看到.
比如最近遇到了. base image升级到了net8,更底层的linux system packages 也随之有要求, 一台比较早版本的host上就run不起来. 初始化cli的时候挂掉了. 最后升级了主机系统才能正常跑.
是错误的 route template 引发异常造成 Aborted (core dumped)
,手动运行容器启动应用显示了错误信息,在 docker swarm 部署环境下 docker service logs
看不到错误信息,应该是 docker swarm 的问题
如果容器正常启动,docker service logs
可以正常看到 Console.WriteLine
输出
@dudu: swarm 好放弃了😂
@czd890: staging 环境用的还是 swarm
在 ASP.NET Core 中,异常处理方式与传统的 AppDomain.CurrentDomain.UnhandledException 事件略有不同。ASP.NET Core 使用了不同的管道和机制来处理异常。
要在 ASP.NET Core 应用中捕获启动时的异常并输出到控制台,你可以在 Main 方法中添加异常处理代码。以下是一个示例:
csharp
Copy code
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Hosting;
using System;
namespace YourAspNetCoreApp
{
public class Program
{
public static void Main(string[] args)
{
try
{
CreateHostBuilder(args).Build().Run();
}
catch (Exception ex)
{
Console.WriteLine("Unhandled exception during application startup:");
Console.WriteLine(ex.ToString());
}
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
}
}
在上述代码中,我们使用了 try-catch 块来捕获启动时的异常,并将异常信息输出到控制台。这样,即使应用程序在启动时发生异常,你也能够看到相应的错误信息。
确保替换 YourAspNetCoreApp 为你实际的应用程序名称。这段代码应该放置在 Program.cs 文件中。