为每个源文件单独设置跟踪级别的技术

时间:2014-05-07 07:28:27

标签: c++ c trace

我想知道,对你来说最好的跟踪技术是什么。 目前,我正在为包含跟踪头之前的每个源女巫宏定义跟踪级别,这是使用已定义的宏。

例如: trace.h里:

#if DEBUG == 0
#define debug(...) 
#define trace(...)

#elif DEBUG==1
#define debug(...) 
#define trace(...) printf(__VA_ARGS__)

#elif DEBUG==2
#define debug(...) printf(__VA_ARGS__)
#define trace(...) printf(__VA_ARGS__)

#else
#error Bad DEBUG value
#endif

对于所有sources.c(trace_value各不相同)

#define DEBUG trace_value
#include "trace.h"

void func(){
  debug("func()");
  trace("func() ok");
  reurn;
}

但是,项目增长了,我想使用预编译的头文件。在我的预编译头文件中包含跟踪头文件会很棒。所以我想知道,你的跟踪技术是什么?谢谢。

编辑: 我忘了写重要的东西,我对延迟关键应用的日志记录技术感兴趣。

1 个答案:

答案 0 :(得分:1)

日志记录是一个复杂的问题,它的作用/使用方式在很大程度上取决于您的应用程序的需求。

在小型应用程序中,我倾向于使用注入的std :: ostream引用或自定义代码来专门记录。我也远离C格式的打印API(并为我需要跟踪的事物定义我自己的operator<<)。

在大型应用程序中,如果您有复杂的跟踪需求(在执行之间轮换日志文件,每个类别的日志以及可从应用程序外部配置,自动日志格式化,高吞吐量/性能日志记录等),请使用外部库(比如log4cpp)。

我也倾向于使用/定义宏,只有在没有它们的情况下才可以编写我的代码。

注入记录流的示例实现:

#include<iosfwd>

class http_server {
public:
    http_server(std::string server, std::uint16_t listening_port,
        std::ostream& log = cnull); // cnull is as defined at 
                                    // http://stackoverflow.com/a/6240980/186997
private:
    std::ostream& log_;
};

主(控制台)代码:

int main(...) {
    http_server("localhost", 8080, std::clog);
}

单元测试代码:

std::ostringstream server_log;
http_server("localhost", 8080, server_log);
// assert on the contents of server_log

基本上,我认为如果我需要跟踪,它是API接口的一部分,而不是事后的想法,我会通过宏禁用或硬编码的东西。

如果我需要格式化日志记录,我会考虑专门化一个std :: ostream,或者(很可能)将它包装到一个专门的格式化类中并注入它。

用于跟踪代码的宏通常保留用于性能关键代码(如果它没有做任何事情,你就无法调用它们。)