首页 > 解决方案 > 如何将消息时间戳写入日志文件?

问题描述

我正在尝试为我的 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();
}

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

在过去的几天里,这让我很困扰,我似乎无法弄清楚,所以任何输入都会非常有帮助。提前致谢!

标签: c++loggingtimetimestampchrono

解决方案


获取 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

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

在 C++20 中,这非常简单。

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

有关如何指定这些参数的更多信息,std::format请参阅规范。std::formatter

截至 2020 年 12 月,尚无主要编译器支持该<format>库,因此您可以使用fmt该库的独立实现作为替代方案。

C++20 之前

考虑一下Howard Hinnant 的date,其中大部分都作为库的新部分并入 C++20 chrono。在该库中找到的format函数使用与上面建议的 C++20 版本相同的语法,尽管没有与std::format.


推荐阅读