如何将消息时间戳记写入日志文件?

ekt*_*r15 0 c++ time logging timestamp c++-chrono

我正在尝试为我的C ++程序创建一个日志文件。我的目标是在程序的两点放置两个时间戳,并在文件中打印这两点之间的CPU时间周期。我这样做是因为我想知道代码的哪些部分最耗时,因此可以进行改进(因此可能要测量几块代码)。到目前为止,我已经制作了一个函数,该函数在被调用时将作为参数传递的字符串打印到文件中:

#define LOGFILE "myprog.log"
void Log (std::string message){
    std::ofstream ofs;
    ofs.open(LOGFILE, std::ofstream::out | std::ios::app);
    ofs << message << std::endl;
    ofs.close();
}
Run Code Online (Sandbox Code Playgroud)

但是,我很难弄清楚如何打印CPU时间戳。首先,我不知道应该使用哪种时间测量格式(我应该使用chrono还是time_t类型?)我正在尝试打印时间段,因此,如果存在持续时间类型(我会我尝试了chrono :: duration,但似乎需要C ++ 11支持)。其次,鉴于我知道要使用哪种类型,如何将其打印到文件中?有没有一种方法可以将该类型转换为字符串?还是可以将其直接传递给函数并以某种方式打印?

最近几天这让我很烦恼,我似乎无法弄清楚,因此任何输入都会很有帮助。提前致谢!

Xir*_*ema 5

获取CPU时间戳

您将需要使用std::chrono::system_clock此时间戳。请勿使用std::chrono::steady_clockstd::chrono::high_resolution_clock来进行高精度的定时测量,也不保证壁钟时间的逼真度或准确性。

auto now = std::chrono::system_clock::now();
//now is a time_point object describing the instant it was recorded according to your system clock
Run Code Online (Sandbox Code Playgroud)

以可读格式打印此CPU时间戳

在C ++ 20中,这很简单。

std::string formatted_time = std::chrono::format("%F_%T", now);
ofs << formatted_time << ": " << message << std::endl;
Run Code Online (Sandbox Code Playgroud)
  • %F是的替代%Y-%m-%D,它将以ISO格式(即)输出年月日2018-10-09
  • %T与相同%H:%M:%S,将输出一个时间,即17:55:34.786

有关std::chrono::format更多选项/详细信息,请参见规格。

在C ++ 20之前

考虑霍华德·辛南特(Howard Hinnant)的date,其中大部分已作为chrono库的新部分并入C ++ 20 。该format库中找到的函数使用与上面针对C ++ 20版本建议的语法相同的语法。