ASP.NET Core 3 WebAPI:如何在Main方法中记录可能的错误
如何在ASP.NET Core 3 WebAPI的Main方法中记录错误
这个问题问到点子上了!Main方法作为ASP.NET Core应用的「入口大门」,这时候依赖注入(DI)容器还没完全初始化,平时控制器里顺手用的ILogger还没法直接通过注入拿到,所以得换个思路来捕获这里的错误并记录。
我给你整理了几个实用的方案,按需选择就行:
方案1:用try-catch兜底,结合基础日志输出
最简单直接的方式就是给Main方法的逻辑套个try-catch块,把异常抓下来后,先用控制台输出做兜底,或者用支持静态调用的日志工具(比如Serilog的静态日志)来记录。毕竟这时候正式的日志系统还没准备好,先把错误信息留住最重要。
示例代码:
public static void Main(string[] args) { try { CreateHostBuilder(args).Build().Run(); } catch (Exception ex) { // 先通过控制台输出保底 Console.WriteLine($"Main方法触发未处理异常: {ex.Message}"); Console.WriteLine(ex.StackTrace); // 如果用Serilog的话,可以提前配置好静态日志,这里直接写致命错误 // Log.Fatal(ex, "应用启动失败,终止运行"); } }
方案2:先构建Host,拿到框架日志再启动
如果想用上ASP.NET Core自带的日志系统(比如已经配置好的控制台、文件日志),可以先把Host构建出来,再从Host的服务容器里取出ILogger实例,之后再执行启动逻辑。这样启动过程中的错误就能直接走你配置好的日志流程了。
示例代码:
public static void Main(string[] args) { // 先把Host构建好,这时候服务容器已经初始化了基础日志 var host = CreateHostBuilder(args).Build(); // 从服务容器里获取Program类对应的日志实例 var logger = host.Services.GetRequiredService<ILogger<Program>>(); try { logger.LogInformation("WebAPI应用准备启动..."); host.Run(); } catch (Exception ex) { logger.LogCritical(ex, "Main方法发生致命错误,应用被迫终止"); // 再加个控制台输出做双重保险,防止日志系统本身出问题 Console.WriteLine($"致命错误详情: {ex.Message}"); } }
额外提醒:覆盖CreateHostBuilder内部的错误
要是CreateHostBuilder方法内部出了问题(比如配置文件加载失败、服务注册报错),那方案2可能还没拿到logger就崩了。这时候可以在CreateHostBuilder里提前配置基础日志提供者,让Host初始化阶段就能记录错误:
public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .ConfigureLogging(logging => { // 提前加上控制台、调试日志提供者,覆盖启动初期的错误场景 logging.AddConsole(); logging.AddDebug(); }) .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup<Startup>(); });
总结一下
- 快速解决:用try-catch+控制台/静态日志就能搞定大部分场景;
- 复用框架日志:先Build Host再获取logger,能直接用你配置好的日志流程;
- 覆盖早期错误:别忘了给CreateHostBuilder加基础日志配置,把启动最开始的错误也抓牢。
内容的提问来源于stack exchange,提问作者Konrad
相关产品推荐
相关产品推荐

