【问题标题】:Serilog.Settings.Configuration is not working when it is referenced as packageSerilog.Settings.Configuration 在作为包引用时不起作用
【发布时间】: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.Configuration 3.2.0 中实现的特定功能或修复吗?如果没有,那么您不需要将它作为一个包来引用,因为 Serilog.AspNetCore 已经包含 Serilog.Settings.Configuration - 除了之前的版本 3.1.0
  • @C.AugustoProiete:是的,添加了新功能:能够为格式化程序提供参数(例如我的配置文件中的 ExpressionTemplate)

标签: c# serilog appsettings


【解决方案1】:

2021 年 10 月 11 日更新v3.3.0 has been released 并包含您尝试使用的功能 (Support of constructor parameters)。


您尝试使用的功能 (Support of constructor parameters) 尚未发布,因此在 Serilog.Settings.Configuration 3.2.0 包中不存在这就是您收到该错误的原因...此功能是 @ 987654324@ 待定日期。

你的选择是:

1.) 使用预发布包(例如3.3.0-dev-00291

<PackageReference Include="Serilog.Settings.Configuration" Version="3.3.0-dev-00291" />

2.) 从源代码编译它,正如您在问题中所展示的那样

3.) 等到3.3.0 结束

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2011-08-14
  • 1970-01-01
  • 1970-01-01
  • 2019-09-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多