LibLog—断言对日志记录器的调用

本文关键字:记录器 调用 日志 断言 LibLog | 更新日期: 2023-09-27 18:05:23

使用LibLog时,是否可以断言对日志记录器的调用?给定wiki列出的用法示例如下:

public class MyClass
{
    private static readonly ILog Logger = LogProvider.For<MyClass>(); 
}

这里的日志记录器是对消费者隐藏的实现细节,这是使用这个库的最大好处。这样库使用者就不必担心日志记录器是如何实例化的。看看这篇博文:

http://dhickey.ie/2015/06/capturing-log-output-in-tests-with-xunit2/

似乎添加了很多锅炉板来捕获日志输出,我不完全确定这种方法,因为它还在单元测试中使用了重定向的Serilog输出,这似乎很奇怪,因为库应该只依赖于日志抽象?

我目前能想到的唯一选项是:

注入日志记录器——这对于库的使用者来说可能是奇怪的,然后每个库都将携带需要注入的自己的ILogger定义,从而破坏了抽象的优势。

连接到一个真正的日志框架-设置当前的LogProvider为LibLog使用Log4Net或类似的,然后以某种方式尝试注入一个mock/stub Logger到Log4Net,并通过代理断言调用。

任何相对简单的方法来断言对日志记录器的调用都是值得赞赏的,但我怀疑并行测试执行会导致问题,即使可以断言对上述日志记录器的调用?

LibLog—断言对日志记录器的调用

在几乎所有记录器的日志配置中,您可以配置它们在日志失败时抛出异常。

nlog

中的示例
<nlog throwExceptions="true">
 ... your nlog config
</nlog>

但是在LibLog创建的抽象中你失去了这个特性

我在我的项目中做了什么:

我已经创建了LoggerFactory。它公开的静态方法和NLogger一样。

public class LoggerFactory
{
    private static ILoggerFactoryStrategy _loggerFactoryStrategy = new DummyLoggerFactoryStrategy();
    public static void Initialize(ILoggerFactoryStrategy loggerFactoryStrategy)
    {
        _loggerFactoryStrategy = loggerFactoryStrategy;
    }
    public ILogger GetLogger<T>()
    {
        return _loggerFactoryStrategy.GetLogger<T>();
    }
    ....
}

Dummy策略可以只写调试输出或者什么都不做。另一个策略可能类似于:

public class LoggerFactoryStrategy : ILoggerFactoryStrategy
{
    public ILogger GetLogger<T>()
    {
        //create LibLog instance instead with LogProvider.For<T>()
        var nlogger = LogManager.GetLogger(typeof(T).Name); //create instance of NLogger
        return new NLogLogger(nlogger);
    }
}

NlogLogger包装器可以像

internal class NLogLogger : ILogger
{
    private readonly Logger _logger;
    public NLogLogger(Logger logger)
    {
        _logger = logger;
    }
    public void Debug(string message)
    {
        _logger.Debug(message);
    }
    public void Warn(string message, params object[] args)
    {
        _logger.Warn(message, args);
    }
    public void Info(Exception exception)
    {
        _logger.Info(exception);
    }
    ......
}

当应用程序启动时,我用适当的策略初始化它,使用NLogger

如果我想测试对logger的调用,我可以使用mock策略。这种方法允许您在整个解决方案中删除对日志库的引用(根项目除外),并且允许您在将来需要时从一个库切换到另一个库。