Серилог.Настройки.Конфигурация не работает, когда на нее ссылаются как на пакет

#c# #serilog #appsettings

Вопрос:

Я получаю действительно странное поведение, пытаясь настроить Serilog с помощью appsettings.json.

Это работает только тогда, когда я добавляю Serilog.Настройки.Настройка в моем проекте с помощью добавления ссылки на проект. Когда Серилог.Настройки.Конфигурация (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.Настройки.Конфигурация-это ссылка на пакет):

 <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.Настройки.Конфигурация-это ссылка на проект):

 <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-devsrcSerilog.Settings.ConfigurationSerilog.Settings.Configuration.csproj" />
  </ItemGroup>

</Project>
 

Что я упускаю?
Это похоже на Серилог.Настройки.Конфигурация игнорируется, когда на нее ссылаются как на пакет, верно?
Как я могу это исправить?

Комментарии:

1.Вам нужна конкретная функция или исправление, реализованное в версии Serilog.Settings.Configuration 3.2.0? Если нет, то вам не нужно ссылаться на него как на пакет, потому Serilog.AspNetCore что он уже включает Serilog.Settings.Configuration в себя — за исключением предыдущей версии 3.1.0

2. @C. AugustoProiete: да, добавлена новая функция: возможность предоставлять форматировщику аргументы (например, ExpressionTemplate в моем файле конфигурации)

Ответ №1:

Обновление 2021-10-11: выпущена версия v3.3.0, включающая функцию, которую вы пытаетесь использовать (поддержка параметров конструктора).


Функция, которую вы пытаетесь использовать (поддержка параметров конструктора), еще не выпущена и как таковая отсутствует в Serilog.Settings.Configuration 3.2.0 пакете, поэтому вы получаете эту ошибку… Эта функция планируется к выпуску с 3.3.0 датой TBD.

У вас есть альтернативы:

1.) Используйте пакет предварительного выпуска (например 3.3.0-dev-00291 )

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

2.) Скомпилируйте его из исходного кода, как вы продемонстрировали в своем вопросе

3.) Подождите, пока 3.3.0 не выйдет

Комментарии:

1. Спасибо. README.md немного сбивает с толку: github.com/serilog/serilog-settings-configuration . Посмотрев раздел «Привязка значений сложных параметров», я предположил, что эта функция уже реализована.

2. Обновление 2021-10-11 : выпущена версия v3.3.0