shell脚本log打印
LOG_FILE="${LOG_FILE:-/var/log/myapp.log}"
LOG_MAX_SIZE="${LOG_MAX_SIZE:-10485760}"
LOG_BACKUP_COUNT="${LOG_BACKUP_COUNT:-5}"
LOG_LEVEL_DEBUG=0
LOG_LEVEL_INFO=1
LOG_LEVEL_WARN=2
LOG_LEVEL_ERROR=3
LOG_LEVEL=$LOG_LEVEL_DEBUG
rotate_log() {local log_file="${1:-$LOG_FILE}"if [[ ! -f "$log_file" ]]; thenreturn 0filocal file_size=$(stat -c%s "$log_file" 2>/dev/null || echo "0# 如果文件大小超过限制,则进行轮转if [[ $file_size -gt $LOG_MAX_SIZE ]]; thenecho "$(date '+%Y-%m-%d %H:%M:%S') - Starting log rotation for $log_file (size: $file_size)" >> "$log_file"# 删除最旧的备份文件local oldest_backup="${log_file}.${LOG_BACKUP_COUNT}"if [[ -f "$oldest_backup" ]]; thenrm -f "$oldest_backup"fifor ((i=LOG_BACKUP_COUNT-1; i>=1; i--)); dolocal current_backup="${log_file}.${i}"local next_backup="${log_file}.$((i+1))"if [[ -f "$current_backup" ]]; thenmv "$current_backup" "$next_backup"fidonemv "$log_file" "${log_file}.1"touch "$log_file"chmod 644 "$log_file"echo "$(date '+%Y-%m-%d %H:%M:%S') - Log rotation completed. New log file created." >> "$log_file"return 0fireturn 0
}
log_message() {local level=$1local message=$2local timestamp=$(date '+%Y-%m-%d %H:%M:%S')local level_str=""local color=$NCcase $level in$LOG_LEVEL_DEBUG)level_str="DEBUG"color=$BLUE;;$LOG_LEVEL_INFO)level_str="INFO"color=$GREEN;;$LOG_LEVEL_WARN)level_str="WARN"color=$YELLOW;;$LOG_LEVEL_ERROR)level_str="ERROR"color=$RED;;*)level_str="UNKNOWN";;esac[[ $level -lt $LOG_LEVEL ]] && return 0rotate_log "$LOG_FILE"local log_entry="[$timestamp] [$level_str] - $message"if [[ -t 1 ]]; thenecho -e "${color}${log_entry}${NC}"elseecho "$log_entry"fiecho "$log_entry" >> "$LOG_FILE"return 0
}
log_debug() { log_message $LOG_LEVEL_DEBUG "$1"; }
log_info() { log_message $LOG_LEVEL_INFO "$1"; }
log_warn() { log_message $LOG_LEVEL_WARN "$1"; }
log_error() { log_message $LOG_LEVEL_ERROR "$1"; }
test_logging() {echo "=== 开始日志测试 ==="log_debug "这是一个调试信息"log_info "这是一个普通信息"log_warn "这是一个警告信息" log_error "这是一个错误信息"echo "当前日志级别: $LOG_LEVEL"echo "日志文件: $LOG_FILE"echo "=== 日志测试完成 ==="
}
if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; thentest_logging
fi