appsettings.json 中用于 ASP.NET CORE 应用程序的 Serilog 配置

Serilog config in appsettings.json for an ASP.NET CORE application

免责声明

我知道有几个关于这个主题的类似问题,但我找不到一个能准确代表我遇到的问题。这就是为什么我要提出一个新问题。

现状

我有一个使用 VS2019 构建的 ASP.NET CORE API 应用程序,我想在其中使用 Serilog 来记录到数据库服务器。为此,我使用了一些可用的 Serilog NuGet 包

<PackageReference Include="Serilog" Version="2.10.0" />
<PackageReference Include="Serilog.AspNetCore" Version="4.1.0" />
<PackageReference Include="Serilog.Exceptions" Version="6.1.0" />
<PackageReference Include="Serilog.Exceptions.EntityFrameworkCore" Version="6.1.0" />
<PackageReference Include="Serilog.Extensions.Logging" Version="3.0.1" />
<PackageReference Include="Serilog.Settings.Configuration" Version="3.1.0" />
<PackageReference Include="Serilog.Sinks.Console" Version="3.1.1" />
<PackageReference Include="Serilog.Sinks.MSSqlServer" Version="5.6.0" />

此应用程序使用 4 种构建配置:'Develop'、'Test'、'Acceptance' 和 'Production'

为了设置 Serilog 以便我可以在我的应用程序中使用它,我在 Program.cs

中完成了以下操作
public class Program
{
    public static IConfiguration Configuration { get; } = new ConfigurationBuilder()
        [...]
        .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
        .AddJsonFile($"appsettings.{Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT")}.json", optional: true)
        .Build();

    public static void Main(string[] args)
    {
        Log.Logger = new LoggerConfiguration()
            .ReadFrom.Configuration(Configuration)
            .Enrich.WithExceptionDetails(new DestructuringOptionsBuilder()
              .WithDefaultDestructurers()
              .WithDestructurers(new[] { new DbUpdateExceptionDestructurer() })
              .WithFilter(new IgnorePropertyByNameExceptionFilter("StackTrace")))
            .Enrich.WithProperty([...])
            .WriteTo.Console()
            .CreateLogger();

        [...]
    }

    public static IWebHost BuildWebHost(string[] args) => WebHost.CreateDefaultBuilder(args)
        .UseStartup<Startup>()
        .UseConfiguration(Configuration)
        .UseSerilog()
        .Build();
}

和应用程序设置。*.json:

{
  "Serilog": {
    "MinimumLevel": "Warning",
    "WriteTo": [
      {
        "Name": "MSSqlServer",
        "Args": {
          "connectionString": [...],
          "tableName": [...],
          "autoCreateSqlTable": false,
          "columnOptionsSection": {
            [...]
          }
        }
      }
    ]
  }
}

和 launchsettings.json:

{
  [...]  
  "profiles": {
    "Develop": {
      "commandName": "Project",
      "launchBrowser": true,
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      }
    },
    "Test": {
      "commandName": "Project",
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Test"
      }
    },
    "Acceptance": {
      "commandName": "Project",
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Acceptance"
      }
    },
    "Production": {
      "commandName": "Project",
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Production"
      }
    }
  }
}

[编辑] 所有应用设置文件(appsettings.json 以及所有应用设置.*.json)都具有这些属性

我面临的挑战

当我 运行 在我的机器上本地应用程序(使用 Develop 构建配置)时,一切都按预期工作。日志记录工作正常并记录到我的开发 SQL 服务器。

当我使用 TFS 将应用程序部署到远程计算机时,问题就出现了。无论我是部署到我的开发服务器还是测试服务器,日志记录都不起作用。 appsetting.json 以及 appsetting.*.json 文件已正确部署到服务器。当我手动将设置从适当的 appsettings.*.json 复制到 appsettings.json 时,一切都按预期工作。日志记录在正确的 SQL 数据库中完成。因此我知道设置是正确的。看起来我的部署不知何故只从 appsettings.json 中获取设置,不包括来自 appsettings.*.json 的设置。我一定是忽略了什么,但我看不到什么。希望有人可以帮助我。

在解决方案资源管理器中,右键单击 appsettings.json 并选中“如果更新则复制”。它应该设置为“如果更新则复制”或“始终复制”。我正在考虑您的 serilog 接收器设置和 table 名称在您所有的环境中都是相同的。

我希望这能解决您的问题。

我怀疑您的 运行 在远程计算机上的应用程序没有正确设置环境变量 ASPNETCORE_ENVIRONMENT。

例如,如果您在暂存环境中并希望加载 appsettings.Staging.json,则必须将 ASPNETCORE_ENVIRONMENT 环境变量设置为暂存,否则设置文件不会负载。

注意:launchsettings.json 文件仅适用于本地开发,不适用于在远程服务器上托管。