App logs kept forever: nightly gzip on 249 (LOG_FILE_ROTATION=external), hourly pull to 247 via a forced-command key, health warns if the archive stops

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-10-13 17:54:05 +03:30
parent f4831e93a7
commit 3559c43902
10 changed files with 180 additions and 7 deletions

33
ops/applogs/archive-app-log.sh Executable file
View File

@@ -0,0 +1,33 @@
#!/bin/bash
# روی ۲۴۹، هر شب (zareian-applog-archive.timer). app.log را به logs/archive/ می‌برد و فشرده می‌کند.
# برنامه با LOG_FILE_ROTATION=external از WatchedFileHandler استفاده می‌کند و پس از جابه‌جایی خودش app.log تازه
# می‌سازد؛ خطی که در همان لحظه نوشته شود در فایلِ جابه‌جاشده می‌ماند، گم نمی‌شود.
# این‌جا فقط ۳۰ روز می‌ماند (دیسکِ ۲۴۹ پر است) و فقط فایلی پاک می‌شود که ۲۴۷ گرفتنش را تأیید کرده
# (`.shipped`)؛ نسخه‌ی همیشگی روی ۲۴۷ است (pull-app-logs.sh). فقط زیرِ ~/mathapp-v2/logs می‌نویسد.
set -euo pipefail
LOGS=/home/administrator/mathapp-v2/logs
ARCH="$LOGS/archive"
mkdir -p "$ARCH"
chmod 750 "$ARCH"
stamp=$(date -u +%Y%m%dT%H%M%SZ)
# app.log.1..5 از RotatingFileHandlerِ پیشین (پیش از LOG_FILE_ROTATION=external) هم یک بار بایگانی می‌شوند.
for f in "$LOGS"/app.log.[0-9]*; do
[ -e "$f" ] || continue
n=${f##*.}
mv "$f" "$ARCH/app-$stamp-old$n.log"
done
if [ -s "$LOGS/app.log" ]; then
mv "$LOGS/app.log" "$ARCH/app-$stamp.log"
sleep 5 # نوشتنِ در جریانِ workerها روی فایلِ قدیمی تمام شود
fi
for f in "$ARCH"/app-*.log; do
[ -e "$f" ] || continue
gzip -9 "$f"
chmod 640 "$f.gz"
done
find "$ARCH" -name 'app-*.log.gz' -mtime +30 | while read -r gz; do
[ -e "$gz.shipped" ] && rm -f -- "$gz" "$gz.shipped"
done
echo "archived $(ls "$ARCH"/app-*.log.gz 2>/dev/null | wc -l) files in $ARCH"