log4net 是否为存储的类创建了实例?参数开销与检查日志是否已启用

本文关键字:是否 开销 参数 检查 日志 启用 实例 存储 创建 log4net | 更新日期: 2023-09-27 18:33:53

我对log4net库有疑问。

  1. 通过调用创建的实例是否存储LogManager.GetLogger,是否有过期?我问是因为我想知道包装 log4net 以在调用Log<T> method时创建一个实例是否更好

  2. 由于我正在包装 log4net 库,因此存在字符串参数构造开销,因为我现在只检查包装方法上的IsDebugEnabled等等。开销是为易用性而付出的好代价,还是我应该通过大量If(IsDebugEnabled)检查来弄乱我的代码?

为了更好地可视化,这里有一个来自包装器的代码。

    private static void logOnDebug(string message, Exception ex, bool isAsync)
    {
        if (!_logger.IsDebugEnabled)
            return;
        if (isAsync)
            Task.Factory.StartNew(() => _logger.Debug(message, ex));
        else
            _logger.Debug(message, ex);
    }

log4net 是否为存储的类创建了实例?参数开销与检查日志是否已启用

  1. 所有记录器都保存在 Hierarchy 类(实现 IRepository )的哈希表中。Hierarchy上有一个清空哈希表的方法Clear。哈希表上不存在隐式过期。

  2. 这个问题是主观的,取决于构建消息的成本和您的偏好。Castle 做了一件我非常喜欢的事情,那就是为 ILogger 添加一个新签名(他们对日志记录的自定义抽象),该签名将Func<string>作为参数。在测试级别并查看是否要记录事件之前,不会评估 lambda:

    Logger.Info(() => 非常昂贵的字符串建筑());