在 Mac 上的 VS Code 中的 .NET 6 MVC 项目中使用 Serilog 时出现问题

Problem Using Serilog on .NET6 MVC Project in VS Code on Mac

我正在将遗留的 .NET 2.2 Core MVC 应用程序迁移到 .NET 6。我面临的挑战之一是 Program.cs 不再调用 Startup.cs 所以我需要将所有内容迁移到 Program.cs。大多数情况下,有 1 个问题就可以了。我无法让 Serilog 在 Mac 上使用 VS Code 在调试模式下正常工作。问题是在 Windows.

上使用 Visual Studio Community 2022 似乎工作得很好

复制我的问题:

  1. 确保 Mac
  2. 上安装了 .NET 6
  3. 在 Mac 上打开 Visual Studio 代码(我已经在 x64 和 Arm 上试过了)
  4. 打开终端并创建一个文件夹 mkdir TestMVC 并进入该文件夹 cd TestMVC
  5. 在终端中创建一个 vanilla MVC 项目dotnet new mvc
  6. 在 Visual Studio 代码中打开并按照任何设置说明进行操作(例如:安装 C# 扩展、设置 .Net Core Launch (web) launch.json 和 tasks.json)
  7. 通过 nuget 添加 Serilog Install-Package Serilog -Version 2.10.0 并添加 Serilog.ASPNetCore Install-Package Serilog.AspNetCore -Version 4.1.0
  8. 在 Program.cs 中,在 var builder = WebApplication.CreateBuilder(args); 行下方添加 builder.Host.UseSerilog();
  9. 运行 和调试

它会编译,一切看起来都正常,但不会启动浏览器 window,它会在显示所有各种 DLL 后停止。如果您注释掉 //builder.Host.UseSerilog(); 一切正常。

我不认为它是 Serilog,因为如果我在 Windows 机器上的 Visual Studio 2022 预览版中打开完全相同的项目(没有变化),它工作正常。

有什么建议或想法可以帮助我吗?

VS Code 监视控制台输出以查找在 serverReadyAction 下的 launch.json 中定义的特定正则表达式,因此如果您根本不写入控制台(看起来是你的情况)或者如果你使用与正则表达式不匹配的输出模板写入控制台,那么浏览器将永远不会启动。

"serverReadyAction": {
  "action": "openExternally",
  "pattern": "\bNow listening on:\s+(https?://\S+)"  <<<<<<<<
}

现在写入控制台应该足以让浏览器使用默认模板附带的默认 RegEx 由 VS Code 启动(我知道......不过不要开枪,向VS 代码伙计们!):

builder.Host.UseSerilog((ctx, lc) => lc
    .WriteTo.Console());

如果这不起作用并且 RegEx 不匹配,您可以更改 RegEx,或更改输出模板以匹配 RegEx(hacky,不是我的建议,但有效):

builder.Host.UseSerilog((ctx, lc) => lc
    .WriteTo.Console(outputTemplate: "{Level:w4}: {SourceContext}[0] {NewLine}      {Message:lj}{Exception}{NewLine}"));

只是添加到 C. Augusto Proiete 的回答中,还要确保如果您对 Microsoft 日志记录进行任何日志级别覆盖,则需要 "Microsoft.Hosting.Lifetime": "Information".

例如,覆盖的常见设置是这样的。

"Override": {
"Microsoft": "Warning",
"System": "Warning"        ,
"Microsoft.AspNetCore": "Warning"
} 

通过上述,serilog 将不会记录 vs code 启动浏览器所需的行。

VS Code 正在寻找包含此 Now listening on: https://localhost:7106

的行

你需要添加“Microsoft.Hosting.Lifetime”:“信息”,像这样。

"Override": {
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information",
"System": "Warning"        ,
"Microsoft.AspNetCore": "Warning"
}