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 文件仅适用于本地开发,不适用于在远程服务器上托管。
免责声明
我知道有几个关于这个主题的类似问题,但我找不到一个能准确代表我遇到的问题。这就是为什么我要提出一个新问题。
现状
我有一个使用 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 文件仅适用于本地开发,不适用于在远程服务器上托管。