Logging 日志记录“;“间接费用”;最佳实践?

Logging 日志记录“;“间接费用”;最佳实践?,logging,Logging,在我看到的软件中有这样的东西: string message = "loggging" + getsomedata + "text" + getsomemoredata + ...; DBLog(LOGLEVEL_HIGH, message); DBLog获取更多数据,将所有数据放在一起,并将其传递给“loggingservice” 这适用于非常高的日志级别,仅在一些非常(!)罕见的调试场景中设置。在一个示例系统上,包含此代码的函数平均每秒调用25次 我认为这可能会花费一点性能,因为这是所谓的

在我看到的软件中有这样的东西:

string message = "loggging" + getsomedata + "text" + getsomemoredata + ...;
DBLog(LOGLEVEL_HIGH, message);
DBLog获取更多数据,将所有数据放在一起,并将其传递给“loggingservice”

这适用于非常高的日志级别,仅在一些非常(!)罕见的调试场景中设置。在一个示例系统上,包含此代码的函数平均每秒调用25次


我认为这可能会花费一点性能,因为这是所谓的每次即使注销。这里怎么走?尝试以某种方式达到当前日志级别,并且仅在需要时调用所有这些?就让它保持这样?完全不同的东西?

理想情况下,您的日志代码应该确定是否以及何时进行日志记录。不幸的是,这要求要记录某些内容的代码始终构造并调用日志代码。有一个选项可以从我们的日志层公开一个方法来确定是否记录日志消息,以确定是否应该构造消息

即:


答案取决于语言支持。在我看来,最值得注意的是对宏或内联函数的支持

如果你使用的是内置的宏,比如C++(或者C,你的代码看起来不象),那么你可以把你的宏定义为(假设C/C++宏): 您的

DBWouldLog(level)
可以是简单的宏(或类似的内联函数)

#定义DBWouldLog(级别)(级别
这将消除您似乎担心性能成本的函数调用


请注意,即使您选择的语言不支持宏,您仍然可以通过使用macro system of choice(我见过用于处理Java代码的C预处理器,并且在另一个上下文中亲自使用了
eruby
,以提供更强大的预处理层)首先预处理源文件来轻松支持宏。至少在使用make文件时,实现所需的附加规则是非常容易的。

它本身就决定了这一点。您发布的代码就是我所说的“尝试以某种方式达到当前日志级别,并且仅在需要时调用所有这些”。但我的问题基本上是,这是否有任何意义,或者是否有更好的方式,我以为你担心的是日志消息创建成本。。。而不是日志记录的成本。
  if( DBWouldLog(LOGLEVEL_HIGH) )
  {
         string message = "loggging" + getsomedata + "text" + getsomemoredata + ...;
         DBLog(LOGLEVEL_HIGH, message);
  }
#define DBLog(level, message)                 \
        do {                                  \ 
            if (DBWouldLog(level)) {          \
                DBLog_output(level, message); \
        } while (0)
#define DBWouldLog(level)    (level < DB)