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
発言はすべて私の目を痛めます。車輪の再発明/学習したいツールの誤用ですか? (つまり、シェルスクリプト)
確かに車輪の再発明かもしれませんが、これは自己訓練です.. ある日、料金所の夜勤をやめる.
ノート
指定された my_function_log_* 名に一致するものを探していますが、他にはありません。私がその程度の自由を持っていると仮定するのは良くありません (多くif
の がまさにその理由でそこにあり、そのタイプの「セットメンバーシップ」テストを行うために、構文糖衣または言語機能のより良い使用を探しています)。