【发布时间】:2021-11-26 09:28:09
【问题描述】:
我在尝试使用 appsettings.json 配置 Serilog 时遇到了非常奇怪的行为。
仅当我使用添加项目参考将 Serilog.Settings.Configuration 添加到我的项目时才有效。 当 Serilog.Settings.Configuration (3.2.0) 作为包安装时,我收到异常:
System.InvalidOperationException: 'Cannot create instance of type 'Serilog.Formatting.ITextFormatter' because it is either abstract or an interface.'
这是我用来解析配置的代码示例:
var configuration = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json")
.AddJsonFile($"appsettings.{Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT") ?? "Production"}.json", true)
.Build();
var logger = new LoggerConfiguration()
.ReadFrom.Configuration(configuration)
.CreateLogger();
这是我正在使用的配置:
"Serilog": {
"MinimumLevel": {
"Override": {
"Microsoft": "Debug",
"System": "Debug"
}
},
"Enrich": [ "FromLogContext" ],
"WriteTo": [
{
"Name": "Console",
"Args": {
"formatter": {
"type": "Serilog.Templates.ExpressionTemplate, Serilog.Expressions",
"template": "[{@t:yyyy-MM-dd HH:mm:ss.fff} {@l:u3}] {#if CorrelationId is not null}{CorrelationId} | {#end}{@m:lj}\n{@x}"
}
}
}
]
}
这是一个不工作的项目文件的例子(Serilog.Settings.Configuration 是 PackageReference):
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>net5.0</TargetFramework>
<UserSecretsId>0718b2b6-70cb-4a9b-9c43-30625d246f61</UserSecretsId>
<DockerDefaultTargetOS>Linux</DockerDefaultTargetOS>
<AssemblyName>SomeName</AssemblyName>
<RootNamespace>SomeNamespace</RootNamespace>
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.VisualStudio.Azure.Containers.Tools.Targets" Version="1.14.0" />
<PackageReference Include="Serilog.AspNetCore" Version="4.1.0" />
<PackageReference Include="Serilog.Expressions" Version="3.2.0" />
<PackageReference Include="Serilog.Settings.Configuration" Version="3.2.0" />
</ItemGroup>
</Project>
这是一个工作项目文件的示例(Serilog.Settings.Configuration 是 ProjectReference):
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>net5.0</TargetFramework>
<UserSecretsId>0718b2b6-70cb-4a9b-9c43-30625d246f61</UserSecretsId>
<DockerDefaultTargetOS>Linux</DockerDefaultTargetOS>
<AssemblyName>SomeName</AssemblyName>
<RootNamespace>SomeNamespace</RootNamespace>
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.VisualStudio.Azure.Containers.Tools.Targets" Version="1.14.0" />
<PackageReference Include="Serilog.AspNetCore" Version="4.1.0" />
<PackageReference Include="Serilog.Expressions" Version="3.2.0" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\..\serilog-settings-configuration-dev\src\Serilog.Settings.Configuration\Serilog.Settings.Configuration.csproj" />
</ItemGroup>
</Project>
我错过了什么? 看起来 Serilog.Settings.Configuration 在被引用为包时被忽略了,对吧? 我该如何解决?
【问题讨论】:
-
您需要在
Serilog.Settings.Configuration3.2.0 中实现的特定功能或修复吗?如果没有,那么您不需要将它作为一个包来引用,因为Serilog.AspNetCore已经包含Serilog.Settings.Configuration- 除了之前的版本 3.1.0 -
@C.AugustoProiete:是的,添加了新功能:能够为格式化程序提供参数(例如我的配置文件中的 ExpressionTemplate)
标签: c# serilog appsettings