#!/bin/bash if ! type "include" > /dev/null 2>&1; then include() { . "$(cd "$(dirname "$1")" && pwd)/${2}"; }; fi include "${BASH_SOURCE[0]}" ../../pragma_once.bash if ! pragma_once ${BASH_SOURCE[0]}; then return 0; source ../../pragma_once.bash fi # 这个文件是构建的基础文件 存放最顶层的函数 RESET='\033[0m' # 重置颜色 BLACK='\033[0;30m' RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[0;33m' BLUE='\033[0;34m' PURPLE='\033[0;35m' CYAN='\033[0;36m' WHITE='\033[0;37m' BOLD_BLACK='\033[1;30m' BOLD_RED='\033[1;31m' BOLD_GREEN='\033[1;32m' BOLD_YELLOW='\033[1;33m' BOLD_BLUE='\033[1;34m' BOLD_PURPLE='\033[1;35m' BOLD_CYAN='\033[1;36m' BOLD_WHITE='\033[1;37m' export LOG_LEVEL="${LOG_LEVEL:-3}" # 0=ERROR 1=WARN 2=INFO 3=DEBUG 4=TRACE export LOG_PATH="${LOG_PATH:-}" # 空则不写文件 export LOG_STDOUT="${LOG_STDOUT:-1}" # 1 输出终端 export LOG_COLOR_STDOUT="${LOG_COLOR_STDOUT:-1}" # 默认是否彩色 export LOG_INIT_MODE="${LOG_INIT_MODE:-rotate}" # truncate|append|rotate export LOG_INITIALIZED=0 log_init() { # 如果没有设置 LOG_PATH,直接返回 [[ -z "$LOG_PATH" ]] && return 0 # 如果已经初始化过,直接返回 (( LOG_INITIALIZED )) && return 0 # 获取日志文件的目录 local log_dir log_dir=$(dirname "$LOG_PATH") # 确保日志文件的目录存在,如果不存在则创建 if [[ ! -d "$log_dir" ]]; then mkdir -p "$log_dir" || { echo "ERROR: Failed to create log directory: $log_dir"; exit 1; } fi # 确保日志文件存在,如果不存在则创建 if [[ ! -f "$LOG_PATH" ]]; then touch "$LOG_PATH" || { echo "ERROR: Failed to create log file: $LOG_PATH"; exit 1; } chmod 777 $LOG_PATH fi # 根据初始化模式进行操作 case "$LOG_INIT_MODE" in truncate) : > "$LOG_PATH" # 清空日志文件 ;; append) # 保持原样,直接追加 ;; rotate) # 如果日志文件存在,重命名为带时间戳的文件 if [[ -f "$LOG_PATH" ]]; then mv "$LOG_PATH" "$LOG_PATH.$(date +%Y%m%d_%H%M%S)" fi ;; *) echo "Invalid LOG_INIT_MODE: $LOG_INIT_MODE" exit 1 ;; esac # 标记为已初始化 LOG_INITIALIZED=1 } log() { log_init local level_name="$1" local level_num="$2" local use_color="$3" shift 3 (( level_num > LOG_LEVEL )) && return 0 local fmt="$1" shift local body printf -v body -- "$fmt" "$@" local timestamp #timestamp="$(date '+%Y-%m-%d %H:%M:%S')" timestamp="$(TZ=Asia/Shanghai date '+%Y-%m-%d %H:%M:%S')" local msg printf -v msg "[%s] [%s] %s" \ "$timestamp" \ "$level_name" \ "$body" # -------- stdout -------- if (( LOG_STDOUT )); then local enable_color if [[ -z "$use_color" ]]; then enable_color="$LOG_COLOR_STDOUT" else enable_color="$use_color" fi if (( enable_color )) && [[ -t 1 ]]; then local color="" case "$level_name" in ERROR) color="$BOLD_RED" ;; WARN) color="$BOLD_YELLOW" ;; INFO) color="$GREEN" ;; DEBUG) color="$CYAN" ;; TRACE) color="$PURPLE" ;; *) color="$WHITE" ;; esac printf "%b%s%b\n" "$color" "$msg" "$RESET" else printf "%s\n" "$msg" fi fi # -------- file -------- if [[ -n "$LOG_PATH" ]]; then printf "%s\n" "$msg" >> "$LOG_PATH" fi } log_error() { log ERROR 0 1 "$@"; } log_warn() { log WARN 1 1 "$@"; } log_info() { log INFO 2 1 "$@"; } log_debug() { log DEBUG 3 1 "$@"; } log_trace() { log TRACE 4 1 "$@"; }