Files
xwlb/scripts/install_logrotate.sh
simon 1d3ba02703 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 行与轮转前完全一致
2026-09-25 12:50:11 +08:00

51 lines
2.0 KiB
Bash
Executable File
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/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"