提问者:小点点

如何从。NET Framework初始化。NET Core ILogger或ILoggerFactory并注入到。NET Core内建的类库中的构造函数


我正在使用一个使用。NET核心构建的类库。库只有一个公共类,其中一个构造函数接受ILoggerFactory,另一个重载构造函数接受ILogger。但是我是在使用。NET Framework 4.7构建的控制台应用程序中使用这个库的。我的控制台应用程序使用Log4Net进行日志记录。但是我需要注入ILogger或ILoggerFactory的实例,以便类库根据我的log.config设置记录错误。

我试了如下

ILogger logger=new LoggerFactory()。CreateLogger();var contentManager=新的contentManager(记录器);

但是我不知道如何将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实例?在这方面需要帮助。


共1个答案

匿名用户

尝试适配器模式以促进对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();
}