]> git.corax.cc Git - toolbox/commitdiff
include/log: Add logging facilities
authorMatthias Kruk <m@m10k.eu>
Mon, 22 Mar 2021 00:36:25 +0000 (09:36 +0900)
committerMatthias Kruk <m@m10k.eu>
Mon, 22 Mar 2021 00:36:25 +0000 (09:36 +0900)
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 [new file with mode: 0644]

diff --git a/include/log.sh b/include/log.sh
new file mode 100644 (file)
index 0000000..d4e3760
--- /dev/null
@@ -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]" "$@"
+}