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