日志轮转按业务重要性权重保留文件,用std::map映射路径前缀或后缀到权重值,优先删除低权文件,同权按时间淘汰;权重为0则跳过。

日志轮转时如何按权重决定保留哪些文件
权重不是指文件大小或时间戳的简单排序,而是你定义的“业务重要性”——比如 error.log 权重 10,access.log 权重 5,debug.log 权重 1。系统清理时优先删低权重文件,同权重再按时间淘汰。
关键在设计一个可扩展的权重映射逻辑,而不是硬编码 if-else 判断文件名:
- 用
std::map<:string int>存储后缀或路径前缀到权重的映射(如".error"→ 10,"api/"→ 8) - 解析日志文件名时,按顺序匹配最长前缀或最具体后缀,避免
"debug"匹配到所有含 debug 的名字 - 权重为 0 的文件不参与轮转,直接跳过(适合临时调试日志)
- 注意:权重不解决单个大日志爆炸问题,需配合
max_file_size单独控制
std::filesystem 遍历 + std::chrono 排序的坑在哪
用 std::filesystem::directory_iterator 扫目录看似干净,但实际容易踩三个隐性坑:
- Windows 下 NTFS 时间精度只有 100ns,但
last_write_time()返回的是file_time_type,直接转system_clock::time_point可能截断,导致同秒内多个日志排序错乱 —— 建议统一用file_time_type比较,别强转 -
std::filesystem::is_regular_file()必须显式调用,否则符号链接、socket 文件会混入,file_size()对它们可能抛std::filesystem::filesystem_error - 遍历时没加异常捕获,遇到权限拒绝(如某些 systemd 日志目录)会导致整个轮转中断 —— 应用
std::filesystem::status_known()先探活,失败则跳过并记录警告
示例排序片段:
on_write
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











