#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.02. @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