Files
tools/common/logging.sh
Wang Defa 7def817482 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 颜色日志输出
- 完善的命令重试机制
- 栈追踪支持
2025-12-26 14:47:18 +08:00

200 lines
4.6 KiB
Bash

#!/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
}