c# - Serilog.Settings.Configuration 作为包引用时不起作用

标签 c# serilog appsettings

尝试使用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/

相关文章:

c# - String 未被识别为有效的 DateTime 格式异常

c# - Serilog 在发布 ASP.NET Core 时不记录

c# - OpenTracing 不使用 Serilog 发送日志

java - @PropertySource @Value 静态字符串返回 null

c# - 哪种语句对 SQL 注入(inject)更好、更安全?

c# - 如何使用 C# 将 DateTime 对象转换为仅包含日期的字符串?

c# - 如何从 System.Net.EndPoint 获取主机地址和端口?

asp.net - 如何在 .NET Framework for Serilog 中设置配置

.net - 关于在 .NET Win 应用程序中存储应用程序设置的位置的困惑

azure - 无法使用 PS cmdlet Set-AzWebApp 更新 Azure 应用服务的 AppSettings