可选登录到C++; 我在C++中编写了一个科学计算代码。有我想在控制台中写入的输出和我写入文件的输出。但是,在实现新功能后进行调试时,打印出比平时多得多的信息是很有用的。到目前为止,我只是将更多信息发送到std::cout/clog,并在不需要时将这些行注释掉

可选登录到C++; 我在C++中编写了一个科学计算代码。有我想在控制台中写入的输出和我写入文件的输出。但是,在实现新功能后进行调试时,打印出比平时多得多的信息是很有用的。到目前为止,我只是将更多信息发送到std::cout/clog,并在不需要时将这些行注释掉,c++,C++,我想要的是像std::clog一样,它在需要时进入文件,或者在不需要时根本不做任何事情。如果我需要重新编译代码以在这两种模式之间切换,这是可以的。重要的是,在不需要的时候什么也不发生,因为对于一个真正的大型计算来说,日志文件将是巨大的(或者控制台中充满了垃圾),所有的写入操作都会减慢计算速度 我正在寻找尽可能小的实现,最好只使用标准库来实现可移植性 显而易见的解决方案是使用一个全局变量,将clog重定向到一个文件,然后使用if语句 bool DEBUG = true; std::ofstream

我想要的是像std::clog一样,它在需要时进入文件,或者在不需要时根本不做任何事情。如果我需要重新编译代码以在这两种模式之间切换,这是可以的。重要的是,在不需要的时候什么也不发生,因为对于一个真正的大型计算来说,日志文件将是巨大的(或者控制台中充满了垃圾),所有的写入操作都会减慢计算速度

我正在寻找尽可能小的实现,最好只使用标准库来实现可移植性

显而易见的解决方案是使用一个全局变量,将clog重定向到一个文件,然后使用if语句

bool DEBUG = true;
std::ofstream out("logfile");
std::clog.rdbuf(out.rdbuf());
...
if (DEBUG) std::clog << "my message" << std::endl;
...
bool DEBUG=true;
标准::流输出(“日志文件”);
std::clog.rdbuf(out.rdbuf());
...

如果(DEBUG)std::clog您可以使用C/C++的任何外部日志库。 或者只使用您需要的实用工具创建您自己的小型实现

传统的日志记录机制是基于宏(或内联函数)构建的,如下所示:

#define LOG_MESSAGE(msg) \
{
#ifdef DEBUG
// your debug logging
#else
// your release logging, may be leaved empty
#endif // DEBUG
}

添加不同的日志级别也很有用:错误、警告、信息等。

您需要一个日志库。查看spdlog。您可以使用if-else预处理,您可以将
if(DEBUG)std::clog
放入宏中,如
#定义DEBUG\u clog if(DEBUG)std::clog
,然后
DEBUG\u clog顺便说一句,避免将通用名称命名为
DEBUG
,这将很容易与其他名称冲突。。。i、 e.如果您将进入定义和预处理器的黑暗路径,请使用一些不同的工具,如
ADAMSCICO\u LOG\u ON=false
。如果您已经使用了一些库,如boost,则可以使用记录器,例如