c++ - 如何将消息时间戳写入日志文件?
问题描述
我正在尝试为我的 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 支持)。其次,鉴于我知道要使用什么类型,如何将其打印到文件中?有没有办法将该类型转换为字符串?或者我可以将它直接传递给我的函数并以某种方式打印吗?
在过去的几天里,这让我很困扰,我似乎无法弄清楚,所以任何输入都会非常有帮助。提前致谢!
解决方案
获取 CPU 时间戳
您将要使用std::chrono::system_clock
来获取此时间戳。不要使用std::chrono::steady_clock
或std::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
.
推荐阅读
- wpf - 用户控制器后台操作
- ubuntu - 从颤振 1.9 开始:如何在浏览器中运行颤振应用程序?Flutter run -d chrome 不工作
- javascript - 为什么 jquery-file 上传总是将单个文件发送到后端
- path - 如何将python模块路径设置为jupyter notebook
- python - 拖动鼠标将图像放置在 GUI 上的 PDF 上
- mysql - for循环内的Nodejs查询返回空白数组
- python - Python SQLite:将多个文件中的数据读入TABLE
- actionscript-3 - 有没有办法通过xml为不同平台设置捆绑ID
- swift - iOS 12 中的网络故障 - `NSPOSIXErrorDomain Code=53:软件导致连接中止 #4279
- python - 如何在循环中使用收敛标准来提供 Python 中的矩阵