feat: 代码标准化和文件重命名
## 新增功能 - 创建统一的公共函数库 (common/logging.sh, common/error_handler.sh) - 添加功能演示脚本 (common/demo_usage.sh) - 完善的使用文档 (common/README.md) ## 代码重构 - 重构所有脚本使用统一的公共库 - 为所有函数添加完整的文档注释 - 统一代码格式(4空格缩进、严格模式) - 标准化错误处理和日志输出 ## 文件重命名 - gcp/create_ai_project.sh → gcp/create_ai_projects.sh (单复数统一) - gcp/delete_all_project.sh → gcp/delete_all_projects.sh (单复数统一) - linux/install_ohmyzsh.sh → linux/install_oh_my_zsh.sh (专有名词规范) - linux/create_raid0_with_ext4.sh → linux/create_raid0_array.sh (简化命名) - common/example.sh → common/demo_usage.sh (更具描述性) ## 技术改进 - 使用 readonly 声明常量 - 启用 set -euo pipefail 严格模式 - 统一的 ANSI 颜色日志输出 - 完善的命令重试机制 - 栈追踪支持
This commit is contained in:
199
common/logging.sh
Normal file
199
common/logging.sh
Normal file
@@ -0,0 +1,199 @@
|
||||
#!/bin/bash
|
||||
# ============================================================================
|
||||
# 文件名: logging.sh
|
||||
# 描述: 统一的日志输出函数库
|
||||
# 作者: Cloud Tools Project
|
||||
# 版本: 1.0.0
|
||||
# 依赖: 无
|
||||
# 使用方法: source common/logging.sh
|
||||
# ============================================================================
|
||||
|
||||
# 颜色定义 (ANSI 颜色代码)
|
||||
readonly LOG_COLOR_RED='\033[0;31m'
|
||||
readonly LOG_COLOR_GREEN='\033[0;32m'
|
||||
readonly LOG_COLOR_YELLOW='\033[1;33m'
|
||||
readonly LOG_COLOR_BLUE='\033[0;34m'
|
||||
readonly LOG_COLOR_MAGENTA='\033[0;35m'
|
||||
readonly LOG_COLOR_CYAN='\033[0;36m'
|
||||
readonly LOG_COLOR_RESET='\033[0m'
|
||||
|
||||
# 日志级别定义
|
||||
readonly LOG_LEVEL_DEBUG=0
|
||||
readonly LOG_LEVEL_INFO=1
|
||||
readonly LOG_LEVEL_WARNING=2
|
||||
readonly LOG_LEVEL_ERROR=3
|
||||
readonly LOG_LEVEL_SUCCESS=4
|
||||
|
||||
# 当前日志级别 (默认: INFO)
|
||||
LOG_CURRENT_LEVEL=${LOG_CURRENT_LEVEL:-$LOG_LEVEL_INFO}
|
||||
|
||||
# 日志文件路径 (可选)
|
||||
LOG_FILE_PATH="${LOG_FILE_PATH:-}"
|
||||
|
||||
# 是否启用时间戳
|
||||
LOG_ENABLE_TIMESTAMP=${LOG_ENABLE_TIMESTAMP:-true}
|
||||
|
||||
#
|
||||
# 获取格式化的时间戳
|
||||
# 返回: 格式化的时间字符串
|
||||
#
|
||||
_log_get_timestamp() {
|
||||
date '+%Y-%m-%d %H:%M:%S'
|
||||
}
|
||||
|
||||
#
|
||||
# 内部日志输出函数
|
||||
# 参数:
|
||||
# $1 - 日志级别 (DEBUG|INFO|WARNING|ERROR|SUCCESS)
|
||||
# $2 - 日志颜色
|
||||
# $3 - 日志消息
|
||||
# $4 - 输出目标 (stdout/stderr)
|
||||
#
|
||||
_log_output() {
|
||||
local level="$1"
|
||||
local color="$2"
|
||||
local message="$3"
|
||||
local target="${4:-stdout}"
|
||||
|
||||
local timestamp=""
|
||||
if [[ "$LOG_ENABLE_TIMESTAMP" == "true" ]]; then
|
||||
timestamp="$(_log_get_timestamp) "
|
||||
fi
|
||||
|
||||
local log_line="${timestamp}[${level}] ${message}"
|
||||
local colored_line="${color}${log_line}${LOG_COLOR_RESET}"
|
||||
|
||||
# 输出到控制台
|
||||
if [[ "$target" == "stderr" ]]; then
|
||||
echo -e "$colored_line" >&2
|
||||
else
|
||||
echo -e "$colored_line"
|
||||
fi
|
||||
|
||||
# 输出到日志文件 (如果配置了)
|
||||
if [[ -n "$LOG_FILE_PATH" ]]; then
|
||||
echo "$log_line" >> "$LOG_FILE_PATH"
|
||||
fi
|
||||
}
|
||||
|
||||
#
|
||||
# 调试级别日志
|
||||
# 参数: $1 - 日志消息
|
||||
# 示例: log_debug "Debugging information"
|
||||
#
|
||||
log_debug() {
|
||||
if [[ $LOG_CURRENT_LEVEL -le $LOG_LEVEL_DEBUG ]]; then
|
||||
_log_output "DEBUG" "$LOG_COLOR_CYAN" "$1" "stdout"
|
||||
fi
|
||||
}
|
||||
|
||||
#
|
||||
# 信息级别日志
|
||||
# 参数: $1 - 日志消息
|
||||
# 示例: log_info "Process started"
|
||||
#
|
||||
log_info() {
|
||||
if [[ $LOG_CURRENT_LEVEL -le $LOG_LEVEL_INFO ]]; then
|
||||
_log_output "INFO" "$LOG_COLOR_BLUE" "$1" "stdout"
|
||||
fi
|
||||
}
|
||||
|
||||
#
|
||||
# 警告级别日志
|
||||
# 参数: $1 - 日志消息
|
||||
# 示例: log_warning "Disk space low"
|
||||
#
|
||||
log_warning() {
|
||||
if [[ $LOG_CURRENT_LEVEL -le $LOG_LEVEL_WARNING ]]; then
|
||||
_log_output "WARNING" "$LOG_COLOR_YELLOW" "$1" "stderr"
|
||||
fi
|
||||
}
|
||||
|
||||
#
|
||||
# 错误级别日志
|
||||
# 参数: $1 - 日志消息
|
||||
# 示例: log_error "Failed to connect to server"
|
||||
#
|
||||
log_error() {
|
||||
if [[ $LOG_CURRENT_LEVEL -le $LOG_LEVEL_ERROR ]]; then
|
||||
_log_output "ERROR" "$LOG_COLOR_RED" "$1" "stderr"
|
||||
fi
|
||||
}
|
||||
|
||||
#
|
||||
# 成功级别日志
|
||||
# 参数: $1 - 日志消息
|
||||
# 示例: log_success "Deployment completed"
|
||||
#
|
||||
log_success() {
|
||||
if [[ $LOG_CURRENT_LEVEL -le $LOG_LEVEL_SUCCESS ]]; then
|
||||
_log_output "SUCCESS" "$LOG_COLOR_GREEN" "$1" "stdout"
|
||||
fi
|
||||
}
|
||||
|
||||
#
|
||||
# 设置日志级别
|
||||
# 参数: $1 - 日志级别 (DEBUG|INFO|WARNING|ERROR|SUCCESS)
|
||||
# 示例: log_set_level "DEBUG"
|
||||
#
|
||||
log_set_level() {
|
||||
local level
|
||||
level="$(echo "$1" | tr '[:lower:]' '[:upper:]')"
|
||||
|
||||
case "$level" in
|
||||
DEBUG) LOG_CURRENT_LEVEL=$LOG_LEVEL_DEBUG ;;
|
||||
INFO) LOG_CURRENT_LEVEL=$LOG_LEVEL_INFO ;;
|
||||
WARNING) LOG_CURRENT_LEVEL=$LOG_LEVEL_WARNING ;;
|
||||
ERROR) LOG_CURRENT_LEVEL=$LOG_LEVEL_ERROR ;;
|
||||
SUCCESS) LOG_CURRENT_LEVEL=$LOG_LEVEL_SUCCESS ;;
|
||||
*)
|
||||
log_error "Invalid log level: $1"
|
||||
return 1
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
#
|
||||
# 设置日志文件路径
|
||||
# 参数: $1 - 日志文件完整路径
|
||||
# 示例: log_set_file "/var/log/myapp.log"
|
||||
#
|
||||
log_set_file() {
|
||||
LOG_FILE_PATH="$1"
|
||||
|
||||
# 创建日志文件目录
|
||||
local log_dir
|
||||
log_dir="$(dirname "$LOG_FILE_PATH")"
|
||||
if [[ ! -d "$log_dir" ]]; then
|
||||
mkdir -p "$log_dir" 2>/dev/null || {
|
||||
log_error "无法创建日志目录: $log_dir"
|
||||
return 1
|
||||
}
|
||||
fi
|
||||
|
||||
# 初始化日志文件
|
||||
if [[ ! -f "$LOG_FILE_PATH" ]]; then
|
||||
touch "$LOG_FILE_PATH" 2>/dev/null || {
|
||||
log_error "无法创建日志文件: $LOG_FILE_PATH"
|
||||
return 1
|
||||
}
|
||||
fi
|
||||
|
||||
log_info "日志输出到文件: $LOG_FILE_PATH"
|
||||
}
|
||||
|
||||
#
|
||||
# 禁用时间戳
|
||||
# 示例: log_disable_timestamp
|
||||
#
|
||||
log_disable_timestamp() {
|
||||
LOG_ENABLE_TIMESTAMP=false
|
||||
}
|
||||
|
||||
#
|
||||
# 启用时间戳
|
||||
# 示例: log_enable_timestamp
|
||||
#
|
||||
log_enable_timestamp() {
|
||||
LOG_ENABLE_TIMESTAMP=true
|
||||
}
|
||||
Reference in New Issue
Block a user