mirror of
https://github.com/wekan/wekan.git
synced 2025-12-16 15:30:13 +01:00
188 lines
5.4 KiB
Bash
Executable file
188 lines
5.4 KiB
Bash
Executable file
#!/bin/bash
|
|
|
|
# MongoDB Log Rotation Script for Wekan Snap
|
|
# This script handles log rotation for MongoDB logs in the Wekan snap environment
|
|
|
|
set -e
|
|
|
|
# Source settings if available, otherwise use defaults
|
|
if [ -f "$SNAP/bin/wekan-read-settings" ]; then
|
|
source $SNAP/bin/wekan-read-settings
|
|
else
|
|
# Default values when wekan-read-settings is not available
|
|
SNAP_COMMON="/var/snap/wekan/common"
|
|
SNAP_NAME="wekan"
|
|
fi
|
|
|
|
# Configuration
|
|
MONGODB_LOG="${SNAP_COMMON}/mongodb.log"
|
|
MAX_SIZE_MB=100
|
|
KEEP_COPIES=10
|
|
COMPRESS_LOGS=true
|
|
|
|
# Logging functions
|
|
log_message() {
|
|
local message="$1"
|
|
local timestamp=$(date '+%Y-%m-%d %H:%M:%S')
|
|
echo "[$timestamp] $message"
|
|
}
|
|
|
|
log_error() {
|
|
local message="$1"
|
|
log_message "ERROR: $message"
|
|
}
|
|
|
|
log_success() {
|
|
local message="$1"
|
|
log_message "SUCCESS: $message"
|
|
}
|
|
|
|
log_warning() {
|
|
local message="$1"
|
|
log_message "WARNING: $message"
|
|
}
|
|
|
|
# Check if log file exists and is large enough to rotate
|
|
check_rotation_needed() {
|
|
if [ ! -f "$MONGODB_LOG" ]; then
|
|
log_message "MongoDB log file not found: $MONGODB_LOG"
|
|
return 1
|
|
fi
|
|
|
|
# Get log file size in MB
|
|
local log_size_mb=$(du -m "$MONGODB_LOG" | cut -f1)
|
|
|
|
if [ "$log_size_mb" -lt "$MAX_SIZE_MB" ]; then
|
|
log_message "MongoDB log size (${log_size_mb}MB) is below rotation threshold (${MAX_SIZE_MB}MB)"
|
|
return 1
|
|
fi
|
|
|
|
log_message "MongoDB log size (${log_size_mb}MB) exceeds rotation threshold (${MAX_SIZE_MB}MB)"
|
|
return 0
|
|
}
|
|
|
|
# Rotate MongoDB log file
|
|
rotate_log() {
|
|
local mongodb_log="$1"
|
|
local max_size_mb="$2"
|
|
local keep_copies="$3"
|
|
local compress="$4"
|
|
|
|
log_message "Starting MongoDB log rotation"
|
|
|
|
# Create rotated log file with timestamp
|
|
local timestamp=$(date +%Y%m%d-%H%M%S)
|
|
local rotated_log="${mongodb_log}.${timestamp}"
|
|
|
|
# Copy current log to rotated file
|
|
if cp "$mongodb_log" "$rotated_log"; then
|
|
log_message "Created rotated log file: $rotated_log"
|
|
|
|
# Truncate original log file
|
|
if > "$mongodb_log"; then
|
|
log_message "Truncated original log file"
|
|
else
|
|
log_error "Failed to truncate original log file"
|
|
return 1
|
|
fi
|
|
|
|
# Compress rotated log file if requested
|
|
if [ "$compress" = "true" ]; then
|
|
if gzip "$rotated_log"; then
|
|
log_message "Compressed rotated log file: ${rotated_log}.gz"
|
|
else
|
|
log_warning "Failed to compress rotated log file"
|
|
fi
|
|
fi
|
|
|
|
# Clean up old rotated logs (keep only specified number)
|
|
local old_logs=$(ls -t "${mongodb_log}".* 2>/dev/null | tail -n +$((keep_copies + 1)))
|
|
if [ -n "$old_logs" ]; then
|
|
echo "$old_logs" | xargs rm -f
|
|
log_message "Cleaned up old rotated log files"
|
|
fi
|
|
|
|
log_success "MongoDB log rotation completed successfully"
|
|
return 0
|
|
else
|
|
log_error "Failed to create rotated log file"
|
|
return 1
|
|
fi
|
|
}
|
|
|
|
# Show log file statistics
|
|
show_log_stats() {
|
|
if [ ! -f "$MONGODB_LOG" ]; then
|
|
log_message "MongoDB log file not found: $MONGODB_LOG"
|
|
return 1
|
|
fi
|
|
|
|
local log_size_mb=$(du -m "$MONGODB_LOG" | cut -f1)
|
|
local log_lines=$(wc -l < "$MONGODB_LOG" 2>/dev/null || echo "0")
|
|
local rotated_count=$(ls -1 "${MONGODB_LOG}".* 2>/dev/null | wc -l)
|
|
|
|
log_message "MongoDB Log Statistics:"
|
|
log_message " Current log size: ${log_size_mb}MB"
|
|
log_message " Current log lines: ${log_lines}"
|
|
log_message " Rotated log files: ${rotated_count}"
|
|
log_message " Rotation threshold: ${MAX_SIZE_MB}MB"
|
|
log_message " Keep copies: ${KEEP_COPIES}"
|
|
}
|
|
|
|
# Force rotation regardless of size
|
|
force_rotation() {
|
|
log_message "Force rotating MongoDB log file"
|
|
|
|
if [ ! -f "$MONGODB_LOG" ]; then
|
|
log_error "MongoDB log file not found: $MONGODB_LOG"
|
|
return 1
|
|
fi
|
|
|
|
rotate_log "$MONGODB_LOG" "$MAX_SIZE_MB" "$KEEP_COPIES" "$COMPRESS_LOGS"
|
|
}
|
|
|
|
# Main function
|
|
main() {
|
|
local action="${1:-check}"
|
|
|
|
case "$action" in
|
|
"check")
|
|
log_message "Checking if MongoDB log rotation is needed"
|
|
if check_rotation_needed; then
|
|
log_message "Log rotation is needed"
|
|
rotate_log "$MONGODB_LOG" "$MAX_SIZE_MB" "$KEEP_COPIES" "$COMPRESS_LOGS"
|
|
else
|
|
log_message "Log rotation is not needed"
|
|
fi
|
|
;;
|
|
"force")
|
|
force_rotation
|
|
;;
|
|
"stats")
|
|
show_log_stats
|
|
;;
|
|
"help"|"-h"|"--help")
|
|
echo "Usage: $0 [check|force|stats|help]"
|
|
echo ""
|
|
echo "Commands:"
|
|
echo " check - Check if rotation is needed and rotate if so (default)"
|
|
echo " force - Force rotation regardless of log size"
|
|
echo " stats - Show log file statistics"
|
|
echo " help - Show this help message"
|
|
echo ""
|
|
echo "Configuration:"
|
|
echo " Log file: $MONGODB_LOG"
|
|
echo " Max size: ${MAX_SIZE_MB}MB"
|
|
echo " Keep copies: $KEEP_COPIES"
|
|
echo " Compress: $COMPRESS_LOGS"
|
|
;;
|
|
*)
|
|
log_error "Unknown action: $action"
|
|
echo "Use '$0 help' for usage information"
|
|
exit 1
|
|
;;
|
|
esac
|
|
}
|
|
|
|
# Run main function
|
|
main "$@"
|