将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.cs
的 App
方法中的 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,丰富的公共类库,代码示例 下