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:
@@ -38,7 +38,7 @@
|
||||
- **可重跑的分步入口**:只重做转写、只重做切分、强制重切,都有独立命令。
|
||||
- **配置分层**:口令/Key 在 `.env`,其余(含**三个模型名**与**各供应商 base url**)在 `config.yml`;换模型、换供应商都不用动代码。
|
||||
- **失败说得清楚**:缺 Key、连不上库(含隧道提示)、模型返回非 JSON 等都有明确日志与修复指引。
|
||||
- **97 项离线自检**:配置、清理、事实守卫、LLM 返回解析、隧道自愈五个测试套件,不依赖网络与真实 API。
|
||||
- **116 项离线自检**:配置、清理、事实守卫、LLM 返回解析、隧道自愈、日志轮转六个测试套件,不依赖网络与真实 API。
|
||||
|
||||
### 1.3 当前数据规模(2026-09-25 实测)
|
||||
|
||||
@@ -373,7 +373,7 @@ endpoints:
|
||||
|
||||
### 3.6 自检与测试
|
||||
|
||||
五个测试套件共 **97 项断言**,全部离线运行(不消耗 API 额度、不触碰真实文件):
|
||||
六个测试套件共 **116 项断言**,全部离线运行(不消耗 API 额度、不触碰真实文件):
|
||||
|
||||
```bash
|
||||
.venv/bin/python tests/test_config.py # 37 项:配置加载、优先级、接入点/路由、敏感项隔离
|
||||
@@ -381,6 +381,7 @@ endpoints:
|
||||
.venv/bin/python tests/test_fidelity_guard.py # 14 项:数值事实守卫(含真实篡改样例)
|
||||
.venv/bin/python tests/test_news_parse.py # 16 项:LLM 返回解析(含真实坏返回)
|
||||
.venv/bin/python tests/test_tunnel.py # 20 项:隧道自愈各分支(临时端口,不碰真实隧道)
|
||||
.venv/bin/python tests/test_logrotate.py # 19 项:轮转指令、保留天数、行尾注释、占位符替换
|
||||
```
|
||||
|
||||
其中隧道测试**不会碰真实的 13306 与 autossh.sh**:它用临时 config.yml + 临时端口的假脚本,
|
||||
@@ -470,7 +471,39 @@ mysql:
|
||||
|
||||
(直连远端数据库时,`host` 不是本机地址 → 判定为"不适用隧道",不会去跑 autossh.sh。)
|
||||
|
||||
### 3.9 故障排查
|
||||
### 3.9 日志轮转
|
||||
|
||||
```bash
|
||||
bash scripts/install_logrotate.sh # 安装/更新(幂等,可反复执行)
|
||||
```
|
||||
|
||||
两处一起收口,都是**保留 14 天**:
|
||||
|
||||
| 日志 | 位置 | 策略 |
|
||||
|---|---|---|
|
||||
| 任务日志 `main.log` | 项目根(`>>main.log` 追加) | logrotate:**每天轮转、保留 14 份、立即压缩** → `main.log-20260925.gz` |
|
||||
| systemd journal | `/var/log/journal` | journald:`MaxRetentionSec=14day` + `SystemMaxUse=500M` |
|
||||
|
||||
实测效果:34MB 的 `main.log` 轮转后成 2.9MB 压缩归档,**归档行数与轮转前完全一致**(32453 行),磁盘立即回收。
|
||||
|
||||
配置里有两个容易踩的点:
|
||||
|
||||
- **必须用 `copytruncate`**:脚本以 `>>main.log` 方式持续写入,一次任务跑几十分钟、句柄一直开着。
|
||||
默认的"改名+新建"会让运行中的进程继续写旧文件,当晚日志被切进归档、新文件却空着。
|
||||
- **指令后面不能写注释**:logrotate 会把注释当成参数值(实测报
|
||||
`bad rotation count '14 # 保留 14 份'`),注释只能单独成行。
|
||||
`tests/test_logrotate.py` 专门锁住了这条。
|
||||
|
||||
轮转由系统自带的 `logrotate.timer`(每天 00:46)驱动,无需额外定时任务。
|
||||
|
||||
```bash
|
||||
sudo logrotate -d /etc/logrotate.d/xwlb # 干跑校验配置
|
||||
sudo logrotate -f /etc/logrotate.d/xwlb # 立即轮转一次
|
||||
zcat main.log-20260925.gz | less # 看归档
|
||||
ls -lh main.log* # 看当前归档与占用
|
||||
```
|
||||
|
||||
### 3.10 故障排查
|
||||
|
||||
| 现象 | 原因 / 处理 |
|
||||
|---|---|
|
||||
@@ -487,6 +520,8 @@ mysql:
|
||||
| 换供应商后报模型不存在 | `models.correct_model` / `models.split_model` 还是旧供应商的模型名,需同步修改 |
|
||||
| `getVideo5` 报某天 404 | 该天页面尚未上线(当天节目过期或未发布),日志会明确跳过 |
|
||||
| 磁盘被中间产物占满 | `python cleanup.py --dry-run` 查看,再 `python cleanup.py` |
|
||||
| `main.log` 越来越大 | 已配 logrotate 保留 14 天(见 3.9);未装则 `bash scripts/install_logrotate.sh` |
|
||||
| 日志轮转报 `bad rotation count` | 指令行写了行尾注释;logrotate 不支持,注释要单独成行 |
|
||||
| 某天识别到一半卡死(无新日志、无 CPU) | ASR 的 `Recognition.call` 没有超时参数,长连接可能悬挂;定时任务有 40 分钟上限并在 21:30/22:00 重试。手动跑请自行 `timeout` |
|
||||
| 定时任务没跑 | `systemctl list-timers xwlb-daily.timer`;`systemctl status xwlb-daily.service`;日志 `journalctl -u xwlb-daily -n 100` |
|
||||
| 定时任务报数据库连接失败 | 隧道服务:`systemctl status xwlb-tunnel`;手动兜底 `bash autossh.sh` |
|
||||
|
||||
Reference in New Issue
Block a user