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
+51
View File
@@ -0,0 +1,51 @@
#!/usr/bin/env bash
# 安装/更新日志轮转(需要 sudo;幂等,可反复执行)
#
# bash scripts/install_logrotate.sh
#
# 做三件事:
# 1) 把 logrotate/xwlb 装到 /etc/logrotate.d/xwlb(替换路径与属主占位符)
# 2) 给 systemd journal 加上限(保留 14 天,避免 journal 无限增长)
# 3) 用 logrotate -d 校验配置,并打印当前归档
set -euo pipefail
DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
OWNER="$(id -un)"
GROUP="$(id -gn)"
SUDO=""
if [ "$(id -u)" -ne 0 ]; then SUDO="sudo"; fi
echo "== 1/3 安装 logrotate 配置 =="
TMP="$(mktemp)"
trap 'rm -f "$TMP"' EXIT
sed -e "s#@PROJECT_DIR@#$DIR#g" -e "s#@OWNER@#$OWNER#g" -e "s#@GROUP@#$GROUP#g" \
"$DIR/logrotate/xwlb" > "$TMP"
$SUDO install -m 0644 -o root -g root "$TMP" /etc/logrotate.d/xwlb
echo " /etc/logrotate.d/xwlb(路径 $DIR,属主 $OWNER)"
echo "== 2/3 journal 上限 =="
$SUDO mkdir -p /etc/systemd/journald.conf.d
$SUDO tee /etc/systemd/journald.conf.d/xwlb.conf >/dev/null <<EOF
# 《新闻联播》任务日志:保留 14 天 + 总量上限,避免 journal 无限增长
# 安装来源:$DIR/scripts/install_logrotate.sh
[Journal]
MaxRetentionSec=14day
SystemMaxUse=500M
EOF
echo " /etc/systemd/journald.conf.d/xwlb.conf(保留 14 天 / 上限 500M)"
if systemctl is-active --quiet systemd-journald; then
$SUDO systemctl restart systemd-journald
echo " systemd-journald 已重启使配置生效"
fi
echo "== 3/3 校验配置 =="
$SUDO logrotate -d /etc/logrotate.d/xwlb 2>&1 | grep -E "considering|rotating|log needs|error|reading config" | head -8 || true
echo
echo "== 当前归档 =="
ls -lh "$DIR"/main.log* 2>/dev/null | awk '{printf " %-42s %s\n", $NF, $5}' || echo " (暂无)"
echo
echo "轮转由 logrotate.timer 每天触发:"
systemctl list-timers logrotate.timer --no-pager 2>/dev/null | head -2 || true
echo
echo "立即轮转一次(可选): sudo logrotate -f /etc/logrotate.d/xwlb"
echo "查看归档内容: zcat $DIR/main.log-YYYYMMDD.gz | less"