记录“开销”最佳做法?

时间:2011-12-07 13:27:04

标签: logging

在我看到的软件中,有类似的东西:

string message = "loggging" + getsomedata + "text" + getsomemoredata + ...;
DBLog(LOGLEVEL_HIGH, message);

DBLog获取更多数据,将它们放在一起并将其传递给“loggingservice”

这是一个非常高的loglevel,只能在一些非常(!)罕见的调试场景中设置。在示例系统中,包含此代码的函数平均每秒调用约25次。

我认为它可能会花费一点性能,因为即使日志记录已关闭,也会每次都调用它。去这儿的方法是什么?尝试以某种方式到达当前的loglevel,只在需要时才调用所有这些?只是让它像这样?完全不同的东西?

2 个答案:

答案 0 :(得分:1)

理想情况下,您的日志记录代码应确定是否以及何时记录。不幸的是,这需要您将要记录的代码始终构造并调用日志代码。可以选择从我们的日志记录层公开一种方法,以确定是否记录日志消息以确定是否应该构造消息。

即:

  if( DBWouldLog(LOGLEVEL_HIGH) )
  {
         string message = "loggging" + getsomedata + "text" + getsomemoredata + ...;
         DBLog(LOGLEVEL_HIGH, message);
  }

答案 1 :(得分:0)

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

如果您使用的语言包含C ++(或代码看起来不像的C)等内置宏,那么您可以将宏定义为(假设C / C ++宏):

#define DBLog(level, message)                 \
        do {                                  \ 
            if (DBWouldLog(level)) {          \
                DBLog_output(level, message); \
        } while (0)

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

#define DBWouldLog(level)    (level < DB)

这将消除您似乎担心性能损失的函数调用。

请注意,即使您选择的语言不支持宏,您仍然可以通过首先使用选择的宏系统预处理源文件来轻松支持宏(我已经看到C预处理器用于处理Java代码并亲自使用{{ 1}}在另一个上下文中提供更强大的预处理层)。至少如果您使用的是make文件,则很容易实现所需的附加规则。