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

时间:2014-12-11 09:20:09

标签: c# log4net wrapper

我对log4net库有疑问。

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

  2. 因为我正在包装log4net库,所以字符串参数构造开销就在那里,因为我现在要在包装方法上检查IsDebugEnabled等等。开销是否是易于使用的代价,或者我应该通过大量If(IsDebugEnabled)检查来混淆我的代码?

  3. 为了更好地可视化,这里是包装器的代码。

        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);
        }
    

1 个答案:

答案 0 :(得分:1)

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

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

    Logger.Info(()=&gt; VeryExpensiveStringBuilding());