您的位置:首页 >C++实现带时间戳的日志类工具
发布于2026-03-01 阅读(0)
扫一扫,手机访问
推荐用 std::chrono::system_clock::now() 获取高精度时间,结合 localtime_s(Windows)或 localtime_r(Linux)转本地时区,毫秒通过 time_since_epoch().count() % 1000000 计算;日志接口采用可变模板参数封装,避免 va_list,优先用 std::ostringstream 或 C++20 std::format。

直接用 std::chrono + std::ostringstream 就能做出线程安全、带毫秒级时间戳、可重定向输出的轻量日志类,不用第三方库,也不必依赖 strftime 这类 C 风格函数。
Windows 和 Linux 下都推荐用 std::chrono::system_clock 获取当前时间,再转为本地时区并格式化。别用 std::time(nullptr),它只到秒级,且不处理时区。
std::chrono::system_clock::now() 取时间点,转成 std::time_t 得到秒数,再用 std::localtime 转本地结构体time_point.time_since_epoch().count() % 1000(单位是纳秒时除 1000000)std::localtime 在多线程下非线程安全,应改用 std::localtime_r(Linux)或 localtime_s(MSVC)C++11 起用可变模板参数比宏更安全,也支持类型检查。不要用 va_list 手动解析,容易出错且无法自动推导类型。
log(const char* fmt, Args&&... args),内部用 std::sprintf 或 std::format(C++20)拼接std::ostringstream + << 流式拼接,避免格式符错误(比如传 std::string 却写 %s)LOG_INFO)仍可保留,但只做 __FILE__、__LINE__ 和级别注入,实际输出走模板函数最简单的办法是每个日志调用都加 std::mutex 锁,但性能差;更合理的是把日志暂存到线程局部缓冲,再由单个日志线程统一刷盘。
log() 入口加 static std::mutex mtx,锁住整个格式化+输出流程std::cout,必须包含时间戳生成和字符串拼接,否则时间/内容可能错位std::ofstream 写文件,记得调用 flush(),否则缓冲区内容可能滞留std::ofstream 可能已关闭用一个全局 enum class LogLevel 和静态变量控制最低输出级别,比预处理器宏更灵活,支持运行时调整。
enum class LogLevel { DEBUG, INFO, WARNING, ERROR },成员值对应整数便于比较static LogLevel g_min_level = LogLevel::INFO,每次 log 前先判断 level >= g_min_levelconstexpr std::array 查表,而不是一堆 if-else,避免分支预测失败set_log_level(LogLevel) 接口,无需重启程序真正难的不是打日志,而是确保时间戳和消息严格对应、多线程下不丢日志、以及关闭日志时不意外触发析构顺序问题——这些细节不显眼,但线上出问题时最难排查。
上一篇:Bing搜索入口最新链接无需登录
下一篇:有道云笔记网页版登录入口官网
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
9