From 326b106fe21934257b110dc01fccc9a8a9672f4c Mon Sep 17 00:00:00 2001 From: Matthias Kruk Date: Mon, 22 Mar 2021 09:36:25 +0900 Subject: [PATCH] include/log: Add logging facilities This commit adds the log module which can be adopted by scripts to log messages to log files that are stored in TOOLBOX_HOME. The module also provides convenience functions for highlighting output and printing stack traces. --- include/log.sh | 134 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 134 insertions(+) create mode 100644 include/log.sh diff --git a/include/log.sh b/include/log.sh new file mode 100644 index 0000000..d4e3760 --- /dev/null +++ b/include/log.sh @@ -0,0 +1,134 @@ +#!/bin/bash + +__init() { + local script_name + local timestamp + + if ! script_name=$(basename "$BASH_ARGV0"); then + echo "Could not determine script name" 1>&2 + return 1 + fi + + if ! timestamp=$(date +"%Y-%m-%d.%H:%M"); then + echo "Could not make timestamp for the log name" 1>&2 + return 1 + fi + + declare -xgri __log_debug=3 + declare -xgri __log_info=2 + declare -xgri __log_warning=1 + declare -xgri __log_error=0 + + declare -xgi __log_verbosity="$__log_warning" + declare -xgr __log_path="$TOOLBOX_HOME/log" + declare -xgr __log_file="$__log_path/$timestamp.$script_name.$$.log" + + if ! mkdir -p "$__log_path"; then + return 1 + fi + + return 0 +} + +log_set_verbosity() { + local verb + + verb="$1" + + if (( verb < __log_error )); then + verb="$__log_error" + elif (( verb > __log_debug )); then + verb="$__log_debug" + fi + + __log_verbosity="$verb" + + return 0 +} + +log_get_verbosity() { + echo "$__log_verbosity" +} + +log_write() { + local level + local prefix + local line + + level="$1" + prefix="$2" + + if (( __log_verbosity < level )); then + return 0 + fi + + if (( $# > 2 )); then + for line in "${@:3}"; do + if ! date +"%F %T %z $prefix $line" >> "$__log_file"; then + echo "Could not write to $__log_file" 1>&2 + return 1 + fi + done + else + while read -r line; do + log_write "$level" "$prefix" "$line" + done + fi + + return 0 +} + +log_stacktrace() { + local i + local indent + + echo "Stacktrace:" + indent=" " + + for (( i = "${#FUNCNAME[@]}"; i > 1; )); do + ((i--)) + echo "$indent${BASH_SOURCE[$i]}:${BASH_LINENO[$i]} ${FUNCNAME[$i]}" + ident+=" " + done + + return 0 +} + +log_highlight() { + local tag + + tag="$1" + + echo "===== BEGIN $tag =====" + if (( $# > 1 )); then + local arg + + for arg in "${@:2}"; do + echo "$arg" + done + else + cat /dev/stdin + fi + echo "===== END $tag =====" +} + +log_debug() { + local dbgtag + local line + + dbgtag="${BASH_SOURCE[1]}:${BASH_LINENO[1]} ${FUNCNAME[1]}:" + + log_write "$__log_debug" "[DBG] $dbgtag" "$@" +} + +log_info() { + log_write "$__log_info" "[INF]" "$@" +} + +log_warn() { + log_write "$__log_warning" "[WRN]" "$@" +} + +log_error() { + log_write "$__log_error" "[ERR]" "$@" +} -- 2.47.3