尝试使用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 在作为包引用时被忽略,对吗? 我该如何解决这个问题?
最佳答案
2021 年 10 月 11 日更新:v3.3.0 has been released并包含您尝试使用的功能 ( Support of constructor parameters )。
您尝试使用的功能 ( Support of constructor parameters ) 尚未发布,因此 Serilog.Settings.Configuration
3.2.0
中不存在该功能> package 这就是您收到该错误的原因...此功能是 planned to be released with 3.3.0
日期待定。
您的替代方案是:
1.) 使用预发布包(例如 3.3.0-dev-00291
)
<PackageReference Include="Serilog.Settings.Configuration" Version="3.3.0-dev-00291" />
2.)从源代码编译它,正如您在问题中演示的那样
3.) 等待 3.3.0
发布
关于c# - Serilog.Settings.Configuration 作为包引用时不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69461663/