log4net 日志记录方法(调试、信息等)有多快?

问题描述 投票:0回答:5

我是 log4net 的忠实粉丝,但最近,一些人(在我的部门)对将其纳入我们的项目提出了质疑,因为每种日志记录方法看似繁重。我认为有比其他技术更好的技术,但这是另一个问题。

我很想知道 log4net DebugFormat 类型调用对您的应用程序的典型影响是什么。我将省略诸如每行代码的日志语句数量等变量,因为我只是在寻找您在现实世界中看到的任何内容。

而且,我知道在长评估语句中添加保护子句的简单技术,例如:

if (log.IsDebug)
{
  log.DebugFormat(...);
}

所以,我们暂时将其排除在考虑范围之外。

performance logging log4net
5个回答
11
投票

我不熟悉 log4net 或 log.DebugFormat(...)。

但是伐木的成本实际上分为两个方面。

第一个是日志记录调用,第二个是日志信息的实际持久化。

当实际上不需要日志记录时,防护程序有助于将日志记录调用减少到最低限度。它往往非常快,因为它只不过是方法调用和两个标量的比较。

但是,当您不使用防护措施时,成本很可能成为创建实际日志记录参数的价格。

例如,在 log4j 中,这是一个常见的习惯用法:

log.debug("Runtime error. Order #" + order.getOrderNo() + " is not posted.");

这里,成本是生成消息的字符串表达式的实际评估。这是因为无论日志记录级别如何,都会创建该表达式和结果字符串。想象一下如果你有类似的东西:

log.debug("Something wrong with this list: " + longListOfData);

这可能会创建一个大且昂贵的字符串变量,如果没有将日志级别设置为 DEBUG,则该变量将被浪费。

守卫:

if (log.isDebug()) {
    log.debug(...);
}

消除这个问题,因为 isDebug 调用很便宜,特别是与参数的实际创建相比。

在我的代码中,我编写了一个用于日志记录的包装器,我可以创建如下日志:

log.debug("Runtime error. Order # {0} is not posted.", order.getOrderNo());

这是一个很好的妥协。这依赖于 Java 可变参数,我的代码检查日志记录级别,然后适当地格式化消息。这几乎和守卫一样快,但写起来更干净。

现在,log.DebugFormat 很可能会做类似的事情,但我不知道。

当然,最重要的是日志记录的实际成本(到屏幕、到文件、到套接字等)。但这只是您需要接受的成本。在实际情况下,我的最佳实践是将实际的日志消息路由到队列,然后使用单独的线程获取该队列并将其输出到正确的通道。这至少有助于使日志记录与主计算脱节,但它本身也有费用和复杂性。


6
投票

我知道这是一个旧线程,但是如何使用一种避免使用基于日志级别的 if 语句填充代码的方法,例如: http://www.beefycode.com/post/Extension-Methods-for-Deferred-Message-Formatting-in-Log4Net.aspx

使用 lambda 表达式构建消息,您甚至可以避免完全评估它。


4
投票

log4net 常见问题解答对此有答案,尽管没有达到您正在寻找的详细程度。

总之:使用这些保护条款。


3
投票

只是从 .NET 角度给出 Will Hartung 的回答:)

调试格式代码为:

if (IsDebugEnabled)
{
    Logger.Log(ThisDeclaringType, m_levelDebug, new SystemStringFormat(CultureInfo.InvariantCulture, format, args), null);
}

基本上是相同的,所以我相信当你使用 DebugFormat 时,你不需要使用保护子句(你可能仍然有一个小的开销,但我认为它小到足以被忽略)

本来会留下评论,但我没有足够的声誉:/


0
投票

仅供参考,现在在 C# 中有一种更快的方法:

https://learn.microsoft.com/en-us/dotnet/csharp/whats-new/tutorials/interpolated-string-handler

写起来有点烦人,但是对于低级日志记录方法来说它非常方便,并且如上所述,大多数日志记录时间都在各种字符串插值上,这将导致最后一刻的调用(如果可能的话)

© www.soinside.com 2019 - 2024. All rights reserved.