【问题标题】:Technique to set trace level separately for every source file为每个源文件分别设置跟踪级别的技术
【发布时间】:2023-03-04 09:08:01
【问题描述】:

我想知道,最适合您的跟踪技术是什么。 目前,我正在为每个源女巫宏定义跟踪级别,就在包括使用已定义宏的跟踪标头之前。

例如: 跟踪.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;
}

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

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

【问题讨论】:

标签: c++ c trace


【解决方案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,或者(很可能)将其包装到专门的格式化类中并注入。

用于跟踪代码的宏通常保留给性能关键代码(如果它不执行任何操作,您将无法调用这些代码)。

【讨论】:

    猜你喜欢
    • 2018-12-03
    • 1970-01-01
    • 1970-01-01
    • 2014-06-20
    • 1970-01-01
    • 2013-05-07
    • 2016-01-20
    • 2011-02-02
    • 1970-01-01
    相关资源
    最近更新 更多