将Log4Net添加到依赖注入后如何访问

Posted

技术标签:

【中文标题】将Log4Net添加到依赖注入后如何访问【英文标题】:How to access Log4Net after adding it to Dependency Injection 【发布时间】:2021-09-28 03:46:04 【问题描述】:

这是我第一次与Microsoft.Extensions.Logging.Log4Net.AspNetCore合作。

我有一个 WPF 应用程序,我在 App.xaml.csApp 方法中的 CreateDefaultBuilder 中添加了 Log4Net 提供程序。紧接着,我想使用LogInformation 写入日志文件,说“正在启动应用程序”。据我所知,由于它已添加到依赖注入容器中的方式,我似乎无法做到这一点。我必须要么调用访问参数列表中的 DI 容器的方法,要么将 Log4Net 添加到 ServiceProvider,然后以这种方式检索服务。但是,这似乎不对,因为我实际上会将 Log4Net 添加到 DI 中两次。

有没有办法在配置 Log4Net 后立即访问 DI 容器,以便我可以写入日志文件?

Host = Microsoft.Extensions.Hosting.Host.CreateDefaultBuilder()
.ConfigureAppConfiguration((context, appBuilder) =>

   // Do some stuff here    
).ConfigureLogging(logBuilder =>

   logBuilder.SetMinimumLevel(Microsoft.Extensions.Logging.LogLevel.Trace);
   logBuilder.AddLog4Net("log4net.config");
)
.ConfigureServices((context, services) =>
      
   Configuration = context.Configuration;

   ConfigureServices(Configuration, services);
)
.Build();

ServiceProvider = Host.Services;

// How to access Log4Net here?
_ISomeLogger.LogInformation("Starting Application");

更新

我正在使用以下示例:https://www.thecodebuzz.com/logging-using-log4net-net-core-console-application/

【问题讨论】:

我没有把 WPF 和 ASP.Net 放在一起?在 Asp.Net Core 应用程序中,您现在可以将 ILogger 注入您的类(服务、控制器等)并使用它。 @Ralf 查看更新后的问题。我正在使用我在网站上找到的示例。我也同意使用来自不同框架的类似乎违反直觉。但是,我之前在将 AddAzureKeyVault 添加到 WPF 应用程序以在 Azure 虚拟机中托管时已经这样做了。 您的容器配置了对 build() 的调用。因此,从您拥有的 ServiceProvider 检索记录器是您可以记录的最早时间。 logger = ServiceProvider.GetService<ILogger>(); logger.LogInformation("Starting Application"); 返回 Null。但是,你很接近。它必须是logger = (ILogger<Program>)ServiceProvider.GetService(typeof(ILogger<Program>)); 我可以发誓我早点尝试过,但它没有用。我想我错过了类型转换。无论如何,这行得通。如果您将其发布为答案,我将接受它。谢谢。 【参考方案1】:

解决方案是在构建后立即从ServiceProvider 访问Log4Net

logger = (ILogger<Program>)ServiceProvider.GetService(typeof(ILogger<Program>));

【讨论】:

真的需要第一次演员吗? 不,我只是按照惯例。

以上是关于将Log4Net添加到依赖注入后如何访问的主要内容,如果未能解决你的问题,请参考以下文章

依赖注入与服务位置

NetCore 3.1 项目搭建反射依赖注入,Swagger结合Jwt,sqlSugar+EfCore异常中间件+Log4Net+MongoDb,Redis+Docker,丰富的公共类库,代码示例 下

如何将依赖项注入到laravel作业中

如何使用 Angular 中的依赖注入将属性指令实例传递给嵌套组件

依赖注入如何在 Cucumber 中工作?

在.NET Core控制台中使用依赖注入