我正在用C++编写一个科学的计算代码。有些输出是我想要写入控制台的,有些是我写入文件的输出。但是,在实现新功能后进行调试时,打印出比通常更多的信息是有用的。到目前为止,我只是向std::cout/clog发送了更多信息,并在不需要时对这些行进行了注释。
我想要的就像std::clog,它会在需要时进入文件,或者根本不做任何事情,当不需要的时候。如果我需要重新编译代码以在两种机制之间切换,这是可以的。重要的是,在不需要的时候什么都不做,因为对于一个真正的大型计算,日志文件将是巨大的(或者是满是垃圾的控制台),而且所有的书写都会减慢计算速度。
我正在寻找最小的实现,理想的情况下只使用标准库的可移植性。
最明显的解决方案是拥有一个全局变量,将阻塞重定向到文件,然后使用if语句。
bool DEBUG = true;
std::ofstream out("logfile");
std::clog.rdbuf(out.rdbuf());
...
if (DEBUG) std::clog << "my message" << std::endl;
...有什么更优雅的方法吗?
编辑:我想避免使用非标准库和预处理器宏(程序散布在许多文件中,而且通常也是一种坏的编程习惯)。我可以想象这种工作的一种方式,但我不知道如何做到这一点,那就是创建一个全局可访问的对象,该对象能够使用<<接受消息并将它们保存到文件中。然后,我可以注释掉这个对象类中保存到文件中的行。但是,我不知道将消息传递给这样一个功能不正常的对象会产生多大的性能影响。
发布于 2019-09-05 11:43:47
您可以为C/C++使用任何外部日志库。或者只使用所需的实用程序创建自己的小实现。
传统的日志机制构建在宏(或内联函数)上,如下所示:
#define LOG_MESSAGE(msg) \
{
#ifdef DEBUG
// your debug logging
#else
// your release logging, may be leaved empty
#endif // DEBUG
}添加不同的日志记录级别也很有用:错误、警告、信息等等。
https://stackoverflow.com/questions/57786502
复制相似问题