我想知道,对你来说最好的跟踪技术是什么。 目前,我正在为包含跟踪头之前的每个源女巫宏定义跟踪级别,这是使用已定义的宏。
例如: 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;
}
但是,项目增长了,我想使用预编译的头文件。在我的预编译头文件中包含跟踪头文件会很棒。所以我想知道,你的跟踪技术是什么?谢谢。
编辑: 我忘了写重要的东西,我对延迟关键应用的日志记录技术感兴趣。
答案 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,或者(很可能)将它包装到一个专门的格式化类中并注入它。
用于跟踪代码的宏通常保留用于性能关键代码(如果它没有做任何事情,你就无法调用它们。)