首次提交
This commit is contained in:
@@ -0,0 +1,14 @@
|
||||
#!/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;
|
||||
. ./log.bash
|
||||
. ./stack_trace.bash
|
||||
fi
|
||||
include "${BASH_SOURCE[0]}" ./log.bash
|
||||
include "${BASH_SOURCE[0]}" ./stack_trace.bash
|
||||
return 0
|
||||
@@ -0,0 +1,158 @@
|
||||
#!/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 "$@"; }
|
||||
|
||||
|
||||
@@ -0,0 +1,104 @@
|
||||
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
|
||||
|
||||
|
||||
set -Eeo pipefail
|
||||
# -e 命令失败退出
|
||||
# -E ERR trap 在函数中生效
|
||||
# -u 未定义变量报错
|
||||
# pipefail pipeline 失败传播
|
||||
#set -E
|
||||
|
||||
|
||||
|
||||
# -E 的作用是:让 ERR trap 在函数、子 shell 等上下文中也会触发
|
||||
|
||||
declare -gi G_PRINT_STACK_TRACE_COUNT=0
|
||||
|
||||
print_stack_trace() {
|
||||
|
||||
printf "\n\n"
|
||||
local ret="${1}"
|
||||
local reason="${2}"
|
||||
|
||||
G_Root="D:/proj/plant_sun_cat/build_script"
|
||||
|
||||
|
||||
local ts
|
||||
ts="$(TZ=Asia/Shanghai date '+%Y-%m-%d %H:%M:%S.%3N')"
|
||||
|
||||
local pid="$$"
|
||||
local bashpid="${BASHPID:-}"
|
||||
local ppid="${PPID:-}"
|
||||
local pwd_now
|
||||
pwd_now="$(pwd 2>/dev/null || echo '<pwd-failed>')"
|
||||
|
||||
local script_name="${BASH_SOURCE[1]:-${BASH_SOURCE[0]}}"
|
||||
local last_cmd="${BASH_COMMAND:-<unknown>}"
|
||||
|
||||
local root_dir="${_library_root_dir_:-<empty>}"
|
||||
local g_root="D:/proj/plant_sun_cat/build_script"
|
||||
|
||||
log_error "\n[#%d]【%s】ret=%d pid=%s bashpid=%s ppid=%s \npwd=%s \nscript=%s \ncmd=%s \nts=%s \nlibrary_root=%s" \
|
||||
"$G_PRINT_STACK_TRACE_COUNT" \
|
||||
"$reason" \
|
||||
"$ret" \
|
||||
"$pid" \
|
||||
"$bashpid" \
|
||||
"$ppid" \
|
||||
"$pwd_now" \
|
||||
"$script_name" \
|
||||
"$last_cmd" \
|
||||
"$ts" \
|
||||
"$root_dir"
|
||||
((G_PRINT_STACK_TRACE_COUNT++)) || true
|
||||
|
||||
|
||||
|
||||
|
||||
local depth=${#FUNCNAME[@]}
|
||||
|
||||
for ((i=0;i<depth;i++)); do
|
||||
local file="${BASH_SOURCE[$i]}"
|
||||
file="$(realpath "$file")"
|
||||
file="${file#${_library_root_dir_}}"
|
||||
file="${G_Root}/${file}"
|
||||
|
||||
local func="${FUNCNAME[$i]}"
|
||||
|
||||
if (( i == 0 )); then
|
||||
line="${BASH_LINENO[0]}"
|
||||
else
|
||||
line="${BASH_LINENO[$((i-1))]}"
|
||||
fi
|
||||
|
||||
log_warn " [%2d] [%s] file:///%s:%s" "$i" "$func" "$file" "$line"
|
||||
done
|
||||
|
||||
exit 75
|
||||
}
|
||||
|
||||
__on_err() {
|
||||
local ret="$1"
|
||||
local cmd="$2"
|
||||
local line="$3"
|
||||
|
||||
print_stack_trace "$ret" "进程错误 cmd=$cmd line=$line"
|
||||
}
|
||||
|
||||
trap '__on_err "$?" "$BASH_COMMAND" "$LINENO"' ERR
|
||||
|
||||
#trap 'print_stack_trace "进程错误" ' ERR
|
||||
|
||||
|
||||
#trap 'echo exit $? ' EXIT
|
||||
|
||||
|
||||
Reference in New Issue
Block a user