log4net 是否为存储的类创建了实例?参数开销与检查日志是否已启用
本文关键字:是否 开销 参数 检查 日志 启用 实例 存储 创建 log4net | 更新日期: 2023-09-27 18:33:53
我对log4net
库有疑问。
-
通过调用创建的实例是否存储
LogManager.GetLogger
,是否有过期?我问是因为我想知道包装 log4net 以在调用Log<T> method
时创建一个实例是否更好 -
由于我正在包装 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);
}
-
所有记录器都保存在
Hierarchy
类(实现IRepository
)的哈希表中。Hierarchy
上有一个清空哈希表的方法Clear
。哈希表上不存在隐式过期。 -
这个问题是主观的,取决于构建消息的成本和您的偏好。Castle 做了一件我非常喜欢的事情,那就是为 ILogger 添加一个新签名(他们对日志记录的自定义抽象),该签名将
Func<string>
作为参数。在测试级别并查看是否要记录事件之前,不会评估 lambda:Logger.Info(() => 非常昂贵的字符串建筑());