【问题标题】:Better way to do debug-logging?进行调试日志记录的更好方法?
【发布时间】:2014-03-23 09:03:45
【问题描述】:

是否有更好的、可能更符合行业标准的方式来打开和关闭整个代码中的调试日志记录?

我目前的情况类似于:

#define logging

[.. in several places throughout the code ..]

#ifdef logging
   cout << "My debug messages\n";
#endif

我只是在不再需要 #define logging 时将其注释掉。 这种方法的一些缺点似乎是:

  • 我必须在每个我想在其中使用它的文件中#define logging
  • 它不是很健壮;我更喜欢#define logging 1 之类的东西,并且能够检查启用了哪个日志记录级别 以确定我的调试输出的粒度。不幸的是,据我所知,#ifdef 并不关心您选择什么值,它只关心它是否已定义

对于如何更好地实现这一点有什么建议吗?

【问题讨论】:

  • 不需要在每个文件中都定义它,例如编译选项-Dlogging
  • 这个问题被问的频率太惊人了。
  • 有很多框架是专门为记录而设计的。他们已经解决了这个问题,还有更多。
  • @JoachimPileborg:有任何*nix 兼容的建议吗? :)
  • syslog/rsyslogd 适用于 linux。除了 conf 文件之外,您还可以使用 setlogmask(我认为无论如何都是这样)从您自己的应用程序内部控制日志级别。

标签: c++ c logging


【解决方案1】:

您可能想查看 Google 的 glog 项目:https://code.google.com/p/google-glog/ 但这可能比您正在寻找的开销更大。

你可以尝试一些简单的事情,授予你的 编译器支持 -Dmacroname 标志,可以转 在编译期间登录。例如:

g++ -Dlogging program.cpp -o program

将日志记录宏定义为 1。

【讨论】:

    【解决方案2】:

    一个建议:

    您可以在项目设置中#define logging,而不是在您想要使用它的每个文件中。

    【讨论】:

    • 项目设置?我假设使用某种 IDE?我目前没有(经常)在我的项目中使用 IDE。
    • 好吧,在这种情况下,您可能应该在一个通用头文件中定义它(除非您希望应用程序中的不同模块具有不同的日志记录级别)。
    【解决方案3】:

    它不是很健壮;我更喜欢#define logging 1 之类的东西,并且能够检查启用了哪个日志记录级别来确定我的调试输出的粒度。

    那你为什么不这样做呢?只是不要使用#ifdef 进行测试,而是使用#if

    #if logging>1
      // something
    #endif
    

    另外 - 您可以在单独的文件中定义 logging(如 myDefines.h)并将其包含在您的其他文件中。

    //myDefines.h
    #define logging 2
    
    //someOtherFile.h
    #include "myDefines.h"
    
    #if logging>1
       // something
    #endif
    

    【讨论】:

      猜你喜欢
      • 2011-01-02
      • 2014-03-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-05
      • 2019-07-19
      • 2011-03-26
      相关资源
      最近更新 更多