c++如何实现日志文件的按天自动滚动与过期删除功能【实战】

张开发
2026/4/18 2:58:03 15 分钟阅读

分享文章

c++如何实现日志文件的按天自动滚动与过期删除功能【实战】
核心是每次写日志前检查当前日期是否异于文件最后修改日期用std::filesystem::last_write_time()与std::chrono截断到零点比对不等则重命名旧文件并新建当日文件滚动时顺手清理过期日志多线程下用互斥锁保护滚动操作。用 std::filesystem 判断日期并切分日志文件核心不是“定时触发”而是每次写日志前检查当前日期是否和上次写入日期不同。C17 的 std::filesystem 能直接读取文件最后修改时间配合 std::chrono 提取年月日即可比对。常见错误是直接用系统时间字符串拼接文件名如 log_ to_string(day) .txt但没处理跨月/跨年时旧文件残留问题——这会导致滚动不干净后续过期逻辑失效。每次打开日志文件前先用 std::filesystem::last_write_time() 读取当前日志文件的修改时间转成 std::chrono::system_clock::time_point再用 std::chrono::floor:chrono::days()/:chrono::days 截断到当天零点同样方式处理当前系统时间两者比较不等就关闭旧文件、重命名加日期后缀、新建当日文件重命名建议用 std::filesystem::rename()它在同磁盘下是原子操作避免写入中断导致日志丢失用 std::filesystem::directory_iterator 扫描并删除过期日志过期不是靠“启动时删一次”而是每次滚动时顺手清理——这样既避免累积太多小文件拖慢扫描又不用额外启线程或依赖外部调度。容易踩的坑是用 std::filesystem::last_write_time() 当作“生成时间”来算过期但 Windows 上该时间可能被编辑器或备份工具篡改更可靠的是从文件名里解析日期比如 app_20240520.log。立即学习“C免费学习笔记深入” 文心快码 文心快码Comate是百度推出的一款AI辅助编程工具

更多文章