Стандартные утилиты вроде
logrotate умеют ротацию по времени или по размеру, но что если нужно оба условия? Например: хочешь сохранять логи по дате, но если они перевалили за 100 МБ - сразу ротация, не дожидаясь полночи.Создаем лог-файл вида: myapp_YYYYMMDD.log, и если он >100M - переименовываем с суффиксом _overflow.
🛠 Пример скрипта:
#!/bin/bash
LOG_DIR="/var/log/myapp"
MAX_SIZE=$((100 * 1024 * 1024)) # 100 MB
TODAY=$(date +%Y%m%d)
LOG_FILE="${LOG_DIR}/myapp_${TODAY}.log"
mkdir -p "$LOG_DIR"
touch "$LOG_FILE"
# Проверка размера
if [[ -f "$LOG_FILE" ]]; then
FILE_SIZE=$(stat -c%s "$LOG_FILE")
if (( FILE_SIZE > MAX_SIZE )); then
TS=$(date +%H%M%S)
mv "$LOG_FILE" "${LOG_FILE%.log}_overflow_${TS}.log"
touch "$LOG_FILE"
echo "[INFO] Перемещен переполненный лог-файл: ${LOG_FILE%.log}_overflow_${TS}.log"
fi
fi
▪️ Где использовать? В cron, например:
*/10 * * * * /usr/local/bin/rotate-mixed.sh
В systemd timer для более точного контроля
🌟 В итоге получается, что скрипт не ждет полуночи - реагирует на объем, при этом логи всегда по дате и простой, не требует logrotate.conf
BashTex 📱 #bash #utils