119 lines
2.6 KiB
Bash
119 lines
2.6 KiB
Bash
#!/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
|
|
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}"
|
|
export LOG_PATH="${LOG_PATH:-}"
|
|
export LOG_STDOUT="${LOG_STDOUT:-1}"
|
|
export LOG_COLOR_STDOUT="${LOG_COLOR_STDOUT:-1}"
|
|
export LOG_INIT_MODE="${LOG_INIT_MODE:-rotate}"
|
|
export LOG_INITIALIZED="${LOG_INITIALIZED:-0}"
|
|
log_init() {
|
|
[[ -z "$LOG_PATH" ]] && return 0
|
|
((LOG_INITIALIZED)) && return 0
|
|
local log_dir
|
|
log_dir="$(dirname "$LOG_PATH")"
|
|
mkdir -p "$log_dir" || {
|
|
echo "ERROR: Failed to create log directory: $log_dir" >&2
|
|
return 1
|
|
}
|
|
case "$LOG_INIT_MODE" in
|
|
truncate)
|
|
: >"$LOG_PATH" || return $?
|
|
;;
|
|
append)
|
|
touch "$LOG_PATH" || return $?
|
|
;;
|
|
rotate)
|
|
if [[ -f "$LOG_PATH" ]]; then
|
|
mv "$LOG_PATH" "$LOG_PATH.$(TZ=Asia/Shanghai date +%Y%m%d_%H%M%S)" || return $?
|
|
fi
|
|
touch "$LOG_PATH" || return $?
|
|
;;
|
|
*)
|
|
echo "Invalid LOG_INIT_MODE: $LOG_INIT_MODE" >&2
|
|
return 1
|
|
;;
|
|
esac
|
|
LOG_INITIALIZED=1
|
|
}
|
|
log() {
|
|
local level_name="$1"
|
|
local level_num="$2"
|
|
local use_color="$3"
|
|
shift 3
|
|
((level_num > LOG_LEVEL)) && return 0
|
|
log_init || return $?
|
|
local fmt="$1"
|
|
shift
|
|
local body
|
|
local timestamp
|
|
local msg
|
|
printf -v body -- "$fmt" "$@"
|
|
timestamp="$(TZ=Asia/Shanghai date '+%Y-%m-%d %H:%M:%S')"
|
|
printf -v msg "[%s] [%s] %s" "$timestamp" "$level_name" "$body"
|
|
if ((LOG_STDOUT)); then
|
|
local enable_color
|
|
local color=""
|
|
if [[ -z "$use_color" ]]; then
|
|
enable_color="$LOG_COLOR_STDOUT"
|
|
else
|
|
enable_color="$use_color"
|
|
fi
|
|
if ((enable_color)) && [[ -t 1 ]]; then
|
|
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
|
|
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 "$@"
|
|
}
|