我正在开发一个“包装脚本”以在 Bash 中用作“日志记录辅助”。
它应该在调用它时打印出有关调用堆栈的信息。
我已经完成了这方面的工作,但仍有几个问题/疑问,我想从这里的专家那里得到最好的答案。
我的代码:
################################################################################
# Formats a logging message.
function my_function_format_logging_message() {
local -r TIMESTAMP="$(date '+%H:%M:%S')"
local -r PROCESS="$$" # Deliberately not using $BASHPID, focus: parent process
local -r CALLER="${FUNCNAME[1]}"
local -i call_stack_position=1
if [[ "${CALLER}" == 'my_function_log_trace' ||
"${CALLER}" == 'my_function_log_debug' ||
"${CALLER}" == 'my_function_log_info' ||
"${CALLER}" == 'my_function_log_warning' ||
"${CALLER}" == 'my_function_log_error' ||
"${CALLER}" == 'my_function_log_critical' ]]
then
call_stack_position=$((call_stack_position++))
fi
local -r SOURCE="$(basename "${BASH_SOURCE[$call_stack_position]}")"
local -r FUNCTION="${FUNCNAME[$call_stack_position]}"
local -r LINE="${BASH_LINENO[$call_stack_position-1]}" # Previous function
local -r SEVERITY="$1"
local -r MESSAGE="$2"
# TODO: perform argument validation
printf '%s [PID %s] %s %s %s:%s - %s\n' \
"${TIMESTAMP}" \
"${PROCESS}" \
"${SEVERITY}" \
"${SOURCE}" \
"${FUNCTION}" \
"${LINE}" \
"${MESSAGE}"
}
################################################################################
使用示例:
my_function_format_logging_message CRITICAL Temporarily increasing energy level to 9001
或者:
my_function_log_info Dropping back to power level 42
我的疑惑:
- call_stack_position=$((call_stack_position++))
我想不出更好的方法来增加这个变量,有没有更好/更易读的形式?
我可以使用更好的构造来检测调用是否是由日志记录方法进行的吗?(例如跟踪、调试、信息......)。所有这些
if
陈述都让我的眼睛受伤。我是在重新发明轮子/滥用我想学习的工具吗?(即shell脚本)
当然,我可能是在重新发明轮子,但这是自我训练……有一天不再是收费站的夜班工人。
笔记
我正在寻找与指定的 my_function_log_* 名称匹配的名称,而没有其他名称。假设我有那种自由度是不对的(很多if
s 正是出于这个原因,我正在寻找一些语法糖或更好地使用语言特性来进行那种类型的“集合成员资格”测试)。