You've already forked clear-log-ubuntu
158 lines
3.5 KiB
Bash
Executable File
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
|
|
#
|