Я столкнулся со следующей проблемой:
Я поддерживаю решение, содержащее несколько исполняемых проектов.
Решение использует централизованное управление пакетами.
Я публикую все проекты в одной папке, чтобы избежать дублирования всех задействованных DLL. До сих пор это работало отлично.
На данный момент все проекты использовали один и тот же приемник — файловый приемник. Теперь один проект также использует консольный приемник, и это, похоже, проблема.
Если я запущу один из проектов, имеющий только файловый приемник, я получу следующее исключение:
Unhandled exception. System.IO.FileNotFoundException: Could not load file or assembly 'Serilog.Sinks.Console, Version=5.0.1.0, Culture=neutral, PublicKeyToken=24c2f752a8e58a10'. The system can not find the specified file.
File name: 'Serilog.Sinks.Console, Version=5.0.1.0, Culture=neutral, PublicKeyToken=24c2f752a8e58a10'
at System.Reflection.RuntimeAssembly.InternalLoad(AssemblyName assemblyName, StackCrawlMark& stackMark, AssemblyLoadContext assemblyLoadContext, RuntimeAssembly requestingAssembly, Boolean throwOnFileNotFound)
at System.Reflection.Assembly.Load(AssemblyName assemblyRef)
at Serilog.Settings.Configuration.ConfigurationReader.LoadConfigurationAssemblies(IConfiguration section, AssemblyFinder assemblyFinder)
at Serilog.Settings.Configuration.ConfigurationReader..ctor(IConfiguration configSection, AssemblyFinder assemblyFinder, ConfigurationReaderOptions readerOptions, IConfiguration configuration)
at Serilog.ConfigurationLoggerConfigurationExtensions.GetConfigurationReader(IConfiguration configuration, ConfigurationReaderOptions readerOptions, DependencyContext dependencyContext)
at Serilog.ConfigurationLoggerConfigurationExtensions.Configuration(LoggerSettingsConfiguration settingConfiguration, IConfiguration configuration, ConfigurationReaderOptions readerOptions)
Неудавшийся проект не имеет ссылки на приемник консоли (и такой приемник не настроен), но, поскольку все копируется в один и тот же каталог, Serilog.Sinks.Console.dll доступен.
Если я удалю Serilog.Sinks.Console.dll или добавлю ссылку на него для связанного проекта, все будет работать. Так это происходит только в том случае, если проект никак не ссылается на приемник, но dll все еще доступен в папке приложения.
Что может быть причиной этого?
Мне кажется странным, что Serilog пытается загрузить сборки, не необходимые для предоставленной конфигурации логгера?
Мой раздел конфигурации выглядит следующим образом (json):
"Serilog": {
"Using": [
"Serilog.Sinks.File"
],
"MinimumLevel": "Debug",
"WriteTo": [
{
"Name": "File",
"Args": {
"path": "MyApp.log"
}
}
],
"Enrich": [
"FromLogContext"
]
И я применяю загруженную конфигурацию следующим образом:
public static ILoggerFactory ConfigureLogging(IConfigurationRoot configuration)
{
// configure Serilog
Log.Logger = new LoggerConfiguration()
.ReadFrom.Configuration(configuration)
.Enrich.WithProperty("Application", System.Reflection.Assembly.GetEntryAssembly()?.Name() ?? "MyApp")
.CreateLogger();
// register with Microsoft.Extensions.Logging
var loggerFactory = new LoggerFactory();
loggerFactory.AddProvider(new SerilogLoggerProvider());
//...
}
Подробнее здесь: https://stackoverflow.com/questions/777 ... ailable-in