c# - 如何从 .NET Framework 初始化 .net Core ILogger 或 ILoggerFactory 并注入到 .Net Core 内置的类库中的构造函数
问题描述
我正在使用一个使用 .NET Core 构建的类库。该库只有一个公共类,其中一个构造函数接受 ILoggerFactory,另一个重载构造函数接受 ILogger。但我在使用 .NET Framework 4.7 构建的控制台应用程序中使用这个库。我的控制台应用程序使用 Log4Net 进行日志记录。但是我需要注入 ILogger 或 ILoggerFactory 的实例,以便类库日志的错误基于我的 log.config 设置。
我尝试如下
ILogger logger = new LoggerFactory().CreateLogger(); var contentManager = new ContentManager(logger);
但我不知道如何将 Log4Net 实例传递给 LoggerFactory。
private static ILog _log = LogManager.GetLogger(typeof(Program));
static void Main(string[] args)
{
ILogger logger = new LoggerFactory().CreateLogger<ContentManager>();
var contentManager = new ContentManager(logger);
contentManager.Run();
}
我没有发现任何记录,并且 ContentManager 不会引发任何异常。我知道 ILogger 实例对我的控制台应用程序中的 Log4Net 一无所知,我需要如何传递 Log4Net 实例?在这方面需要帮助。
解决方案
尝试使用适配器模式来促进对 Log4Net 的委托。我不熟悉 Log4Net,但我想你会理解这个例子:
class MyLoggerAdapter : Library.ILogger
{
private readonly ILog _delegation;
public MyLoggerAdapter(ILog delegation)
{
_delegation = delegation;
}
public void ILogger.Debug(string msg, params object[] p)
{
_delegation.Debug(msg, p);
}
}
然后在你的代码中你可以这样做:
private static ILog _log = LogManager.GetLogger(typeof(Program));
static void Main(string[] args)
{
MyLoggerAdapter logAdapter = new MyLoggerAdapter(_log);
var contentManager = new ContentManager(logAdapter);
contentManager.Run();
}
推荐阅读
- asp.net - 实体类型
不是当前上下文模型的一部分 - c# - C#如何编写带有枚举标识符的JSON
- python - 使用 Python 计算使用多个数据帧和日期时间条件的总概率
- vue.js - Quasar导入动态组件导入未使用
- javascript - YT 播放器 getCurrentTime() 返回 0
- reactjs - 如何在 React 中构建通用列表组件
- xamarin - Xamarin CollectionView ItemsSource 绑定到 ContentView
- windows - 谷歌云平台 Windows Server 2012 激活
- c++ - 重载运算符 [ ] 以返回下标位置的整数。如果作为索引传递的数据类型错误的值,则使用 c++ 进行异常处理
- node.js - 如何使用 keyCloak 保护 Angular(accessType-Public)和 Nodejs 应用程序(accesType-bearer-only)