Serilog,Microsoft.Extensions.Logging和Autofac

时间:2019-11-20 12:11:14

标签: c# asp.net-core serilog

我有一个针对.Net Framework 4.6.1的Asp Net Core API。 在这个项目中,我将Serilog与Microsoft.Extensions.Logging以及Auofac一起用于DI。 在控制器构造函数中将ILogger 记录器与DI配合使用可以很好地工作,而且我也可以获取日志。

当在API中我需要使用另一个项目(使用Microsoft.Extensions.Logging和Autofac)并希望在某些构造函数中收到ILogger 时,乐趣就开始了。 我已经在两个项目中安装了相同版本的Microsoft.Extensions.Logging。

我得到了休闲的异常:

  

Autofac.Core.DependencyResolutionException:'激活Microsoft.Extensions.Logging.Logger 1[[Microsoft.AspNetCore.Hosting.Internal.WebHost, Microsoft.AspNetCore.Hosting, Version=2.2.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60]] -> Microsoft.Extensions.Logging.LoggerFactory -> λ:Microsoft.Extensions.Logging.ILoggerProvider[] -> Microsoft.Extensions.Logging.Console.ConsoleLoggerProvider -> Microsoft.Extensions.Options.OptionsMonitor 1 [[[Microsoft.Extensions.Logging.Console.ConsoleLoggerOptions,Microsoft.Extensions.Logging.Console,版本= 2.2.0.0,文化=中性,PublicKeyToken = adb9793829ddae60]]-> Microsoft.Extensions.Options.OptionsFactory 1[[Microsoft.Extensions.Logging.Console.ConsoleLoggerOptions, Microsoft.Extensions.Logging.Console, Version=2.2.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60]] -> λ:Microsoft.Extensions.Options.IConfigureOptions 1 [[Microsoft.Extensions.Logging.Console.ConsoleLoggerOptions,Microsoft.Extensions.Logging.Console,版本= 2.2.0.0,区域性=中性,PublicKeyToken = adb9793829ddae60]] []-> Microsoft.Extensions.Logging.Console.ConsoleLoggerOptionsSetup-> Microsoft.Extensions.Logging.Configuration.LoggerProviderConfiguration`1 [[Microsoft.Extensions.Logging.Console。 ConsoleLoggerProvider,Microsoft.Extensions.Logging.Console,版本= 2.2.0.0,文化=中性,PublicKeyToken = adb9793829ddae60]]。”

     

内部异常1:   DependencyResolutionException:调用类型为'LoggerProviderConfiguration`1'的构造函数'Void .ctor(Microsoft.Extensions.Logging.Configuration.ILoggerProviderConfigurationFactory)'时引发了异常。

     

内部异常2:   MethodAccessException:尝试通过方法'Microsoft.Extensions.Logging.Configuration.LoggerProviderConfigurationFactory.GetConfiguration(System.Type)'访问方法'Microsoft.Extensions.Logging.ProviderAliasUtilities.GetAlias(System.Type)'失败。

这些是API的软件包:

<PackageReference Include="Autofac" Version="4.9.4" />
    <PackageReference Include="Autofac.Extensions.DependencyInjection" Version="5.0.1" />
    <PackageReference Include="Microsoft.AspNetCore" Version="2.2.0" />
    <PackageReference Include="Microsoft.AspNetCore.Hosting.WindowsServices" Version="2.2.0" />
    <PackageReference Include="Microsoft.AspNetCore.HttpsPolicy" Version="2.2.0" />
    <PackageReference Include="Microsoft.AspNetCore.Mvc" Version="2.2.0" />
    <PackageReference Include="Microsoft.Extensions.Logging" Version="3.0.1" />
    <PackageReference Include="Microsoft.Extensions.Options.ConfigurationExtensions" Version="3.0.1" />
    <PackageReference Include="Serilog.Extensions.Logging" Version="3.0.1" />
    <PackageReference Include="Serilog.Extensions.Logging.File" Version="1.1.0" />
    <PackageReference Include="Serilog.Settings.Configuration" Version="3.1.0" />

这些是另一个项目的软件包:

 <PackageReference Include="Autofac" Version="4.9.4" />
    <PackageReference Include="Microsoft.Extensions.Logging" Version="3.0.1" />
    <PackageReference Include="Microsoft.Extensions.Options.ConfigurationExtensions" Version="3.0.1" />

2 个答案:

答案 0 :(得分:4)

看起来您可能在幕后有一个不匹配的 Microsoft.Extensions.Logging.Configuration ;尝试添加:

<PackageReference Include="Microsoft.Extensions.Logging.Configuration" Version="3.0.1" />

对于两个项目。

答案 1 :(得分:1)

!不相信这是Autofac特有的。我没有使用autofac,而是使用sreilog。对我来说,这是在更新到3.0.1之后立即发生的。

  • Microsoft.EntityFrameworkCore
  • Microsoft.EntityFrameworkCore.SqlServer
  • Microsoft.EntityFrameworkCore.Tools
  • Microsoft.Extensions.DependencyInjection
  • Microsoft.Extensions.Logging.Debug

将Microsoft.Extensions.Logging从v 3.0.1还原到3.0.0可以使我再次运行。 尚不确定根本原因,但这应该可以使您重新开始工作。

如果您使用的是EF Core,并且从3.0.0降到了3.0.1,则还需要将它们回滚到3.0.0。