feat: 日志轮转(保留 14 天)

main.log 无轮转、已涨到 34MB,且每晚任务都会继续追加。

- logrotate/xwlb 模板 + scripts/install_logrotate.sh(幂等,装到 /etc/logrotate.d/xwlb)
- 每天轮转、保留 14 份、立即压缩 → main.log-YYYYMMDD.gz
- 必须用 copytruncate:脚本以 >>main.log 长开句柄,改名式轮转会
  让当晚日志写进归档、新文件空着
- journald 同步设 MaxRetentionSec=14day + SystemMaxUse=500M
- 安装脚本自带 logrotate -d 校验(这条立刻抓到"指令行尾注释"被当成参数值的错误)
- tests/test_logrotate.py 19 项,锁住保留天数、行尾注释、占位符替换

实测:34MB → 2.9MB,归档 32453 行与轮转前完全一致
This commit is contained in:
2026-09-25 12:50:11 +08:00
parent b996b444c4
commit 1d3ba02703
7 changed files with 226 additions and 5 deletions
+9
View File
@@ -294,6 +294,8 @@ xwlb/
| **定时任务(生产入口)** | `bash scripts/run_daily.sh [YYYYMMDD]` | 全链路 + 失败重试(21:30 / 22:00);由 `systemd/xwlb-daily.timer` 每天 21:00 触发 |
| 这天跑到哪一步 | `python scripts/day_status.py <日期>` | 退出码 0=已有精编 / 1=识别完成只缺切分 / 2=需重跑全链路 |
| 安装定时任务 | `bash scripts/install_systemd.sh` | 安装单元、启用定时器与隧道服务 |
| 安装日志轮转 | `bash scripts/install_logrotate.sh` | 装 `/etc/logrotate.d/xwlb`(每天/保留14天/压缩)与 journald 上限(14 天) |
| 校验轮转配置 | `sudo logrotate -d /etc/logrotate.d/xwlb` | 干跑,不实际轮转 |
| 校对效果评估 | `python tools/compare_raw_improve.py --md <文件>` | 统计 news_raw vs news_improve 差异分类与 token 开销 |
| 合并方案评估 | `python tools/experiment_merge_correct_split.py <日期>` | 实测"校对+切分合并成一次调用"的覆盖率与事实漂移 |
| 配置自检 | `python tests/test_config.py` | 校验 config.yml 加载、优先级与敏感项隔离 |
@@ -341,6 +343,13 @@ xwlb/
退出码约定:`0` 成功 / `1` 重试用尽仍失败 / `2` 已有实例在运行。
**日志(保留 14 天)**:任务日志 `main.log` 由 logrotate 每天轮转为
`main.log-YYYYMMDD.gz` 保留 14 份(`logrotate/xwlb` 模板 →
`scripts/install_logrotate.sh` 安装);systemd journal 通过
`/etc/systemd/journald.conf.d/xwlb.conf` 设 `MaxRetentionSec=14day` + `SystemMaxUse=500M`。
轮转必须用 `copytruncate`——脚本以 `>>main.log` 长开句柄,
改名式轮转会让当晚日志写进归档、新文件空着。
**为什么必须有 `state/.asr_complete_<日期>` 标记**:识别中途卡死(B19)会留下部分分片,
若只按"库里有没有分片"判断,重试会走"只重跑切分",把**半天内容当成完整一天**入库且不报错。
标记由 `audioRead.process_long_audio` 在**全部识别成功**时写入,失败时主动删除。