Files
clear-log-ubuntu/clear-log-files
2026-01-28 10:31:58 +01:00

158 lines
3.5 KiB
Bash
Executable File

#!/usr/bin/env bash
# Author : Allan Christensen
# First Created : 12-03-2001 (DD-MM-YYYY)
# Description : Clears rotated logfiles and reports large unrotated logs in /var/log
# License : MIT License
#
# Are we root
#
if [[ $(id -u) -ne 0 ]]; then echo "" && echo "Must be root or use sudo" && echo "" ; exit ; fi
#
# Safety controls
#
#
# Dry run mode
#
# true = simulate deletions, nothing is removed
# false = real run (cron)
#
dryrun=true
#
# Extended rotated log cleanup
#
# Controls deletion of non-logrotate files like:
# app.log.1234
# installer-debug.log.9876
#
# false = report only (safe default)
# true = delete during real runs (dryrun must also be false)
#
extended_cleanup=false
#
# Define variables
#
logdir="/var/log"
#
# Warning threshold for unrotated logs (megabytes)
#
warning=200
resultlog="/var/log/clear-log-files.log"
#
# Initialize log file
#
: > "$resultlog"
chmod 644 "$resultlog"
{
echo "Clear logfiles run : $(date)"
echo "Log Directory : $logdir"
echo "Warning threshold : ${warning} MB"
echo "Dry run : $dryrun"
echo "Extended cleanup : $extended_cleanup"
echo ""
} >> "$resultlog"
#
# Safety check
#
if [[ ! "$logdir" =~ ^/var/log(/|$) ]]; then
echo "ERROR: Refusing to operate outside /var/log: $logdir" >> "$resultlog"
exit 1
fi
#
# Pass 1 — classic rotated logs (logrotate style)
#
echo "Classic rotated log files:" >> "$resultlog"
found=false
while IFS= read -r file; do
found=true
if [[ "$dryrun" == true ]]; then
echo " $file (dry-run)" >> "$resultlog"
else
echo " $file" >> "$resultlog"
rm -f "$file"
fi
done < <(
find "$logdir" -type f \
\( \
-name "*.log.[1-9]" -o -name "*.log.[1-9][0-9]" \
-o -name "*.log.[1-9].gz" -o -name "*.log.[1-9][0-9].gz" \
-o -name "*.log.[1-9].xz" -o -name "*.log.[1-9][0-9].xz" \
-o -name "*.log.[1-9].bz2" -o -name "*.log.[1-9][0-9].bz2" \
-o -name "*.log.[1-9].zst" -o -name "*.log.[1-9][0-9].zst" \
\
-o -name "syslog.[1-9]" -o -name "syslog.[1-9][0-9]" \
-o -name "syslog.[1-9].gz" -o -name "syslog.[1-9][0-9].gz" \
-o -name "syslog.[1-9].xz" -o -name "syslog.[1-9][0-9].xz" \
-o -name "syslog.[1-9].bz2" -o -name "syslog.[1-9][0-9].bz2" \
-o -name "syslog.[1-9].zst" -o -name "syslog.[1-9][0-9].zst" \
\) \
! -name "clear-log-files.log*" \
2>/dev/null
)
[[ "$found" == false ]] && echo " None" >> "$resultlog"
echo "" >> "$resultlog"
#
# Pass 2 — extended rotated logs (non-standard)
#
echo "Extended rotated log files:" >> "$resultlog"
found=false
while IFS= read -r file; do
found=true
if [[ "$dryrun" == true || "$extended_cleanup" == false ]]; then
echo " $file (reported only)" >> "$resultlog"
else
echo " $file" >> "$resultlog"
rm -f "$file"
fi
done < <(
find "$logdir" -type f \
-name "*.log.*" \
! -name "*.log.[1-9]*" \
! -name "clear-log-files.log*" \
2>/dev/null
)
[[ "$found" == false ]] && echo " None" >> "$resultlog"
echo "" >> "$resultlog"
#
# Detect large unrotated logs
#
echo "Large unrotated log files detected:" >> "$resultlog"
found=false
while IFS= read -r file; do
size_mb=$(( $(stat -c %s "$file") / 1024 / 1024 ))
if (( size_mb >= warning )); then
echo " WARNING: $file (${size_mb} MB)" >> "$resultlog"
found=true
fi
done < <(
find "$logdir" -type f \
-name "*.log" \
! -name "clear-log-files.log" \
2>/dev/null
)
[[ "$found" == false ]] && echo " None" >> "$resultlog"
echo "" >> "$resultlog"
#
# End of script
#