From 46d1a6a0afa7899870d49c0e57dd7a5d45c4c1b4 Mon Sep 17 00:00:00 2001 From: Tristan Ancelet Date: Thu, 30 May 2024 17:44:56 -0500 Subject: [PATCH] Added newer script-logging features & implemented them --- log-search | 178 +++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 137 insertions(+), 41 deletions(-) mode change 100644 => 100755 log-search diff --git a/log-search b/log-search old mode 100644 new mode 100755 index f02c484..cff72a0 --- a/log-search +++ b/log-search @@ -32,6 +32,16 @@ CONFIG[hour_filter]=0 CONFIG[remote_host]="N/A" CONFIG[local_file]="N/A" +########################## +# An associative array containing varnames that the user want's to keep track of in log output (specific to each function log is being called from) +# +# [$FUNCNAME]="string of varnames" +# +# It will keep track of vars seperately of each function that log will be used with +########################## +declare -A LOG_WATCH_VARS + + declare -A SEARCH_MODES=( ['CLUSTER']='(crmd|stonith-ng|cib|stonith|pengine|lrmd|pacemakerd|corosync|drbd|ethmonitor)\S*\[' ['ISSUES']='warn|crit|fail|err|' @@ -42,25 +52,95 @@ FLAG_REGEX='[\-]+\S+' # END: Variables +log_import () { + declare -f log_watch_vars log_unwatch_vars log + declare -p LOG_WATCH_VARS +} # BEGIN: Helper Functions +##################### +# Function: log_watch_vars +# Usage: Provide a list of variable names to add to the watchlist for the calling function +log_watch_vars () { + local -a REQUESTED_WATCH_VARS=( $* ) + local CALLING_FUNCTION=${FUNCNAME[1]} + local FUNC_VARS=${LOG_WATCH_VARS[$CALLING_FUNCTION]} + local MATCH_REGEX=${FUNC_VARS//[[:space:]]/|} -log () { - if [[ ${CONFIG[debug]} -eq 1 ]]; then - local MESSAGE=${1:?"$FUNCNAME: No message provided"} - local LEVEL_NUM=${2:-0} + for VARNAME in ${REQUESTED_WATCH_VARS[@]}; do + if [[ ! "$VARNAME" =~ ^$MATCH_REGEX$ ]]; then + FUNC_VARS+=" $VARNAME" + else + log "$VARNAME was provided to add to the list, but already existed there" + fi + done - case $LEVEL_NUM in - 0) LEVEL=INFO;; - 1) LEVEL=WARN;; - 2) LEVEL=CRIT;; - *) LEVEL=UNDEF;; - esac - echo "$(date) : $HOSTNAME : $LEVEL : ${FUNCNAME[1]} : $MESSAGE" - fi + LOG_WATCH_VARS[$CALLING_FUNCTION]=$FUNC_VARS } +##################### +# Function: log_unwatch_vars +# Usage: Provide a list of variable names to remove from the watchlist +log_unwatch_vars () { + ## Serialize the variable names provided by user into REGEX filter "(var1|var2|var3|var4|var_n)" + local MATCH_REGEX="(${@// /|})" + local CALLING_FUNCTION=${FUNCNAME[1]} + local FUNC_VARS=${LOG_WATCH_VARS[$CALLING_FUNCTION]} + local -a TEMP_ARRAY + + for VARNAME in $FUNC_VARS; do + if [[ ! "$VARNAME" =~ ^$MATCH_REGEX$ ]]; then + TEMP_ARRAY+=( $VARNAME ) + fi + done + LOG_WATCH_VARS[$CALLING_FUNCTION]="${TEMP_ARRAY[@]}" +} + +########### +# Function: log +# Usage: Use to print out debug statements for the developer (or user) to display a log output +# including variable values & names +log () { + local MESSAGE=${1:?"$FUNCNAME: No message provided"} + local CALLING_FUNCTION=${FUNCNAME[1]} + local FUNC_VARS=( ${LOG_WATCH_VARS[$CALLING_FUNCTION]} ) + local LEVEL=${2:-0} + local DATE=$(date) + local VAR_WATCH_STRING="" OUTPUT_MESSAGE="" + + if [[ ${CONFIG[debug]} -eq 1 ]]; then + case $LEVEL in + 0) LEVEL="INFO";; + 1) LEVEL="WARN";; + 2) LEVEL="CRIT";; + *) LEVEL="UNDEF";; + esac + + local VARNAME VALUE + if [[ ${#FUNC_VARS[@]} -gt 0 ]]; then + for VARNAME in ${FUNC_VARS[@]}; do + local -n VARVALUE=$VARNAME + if [[ $VARVALUE == "" ]]; then + VALUE='N/A' + else + VALUE=$VARVALUE + fi + if [[ $VAR_WATCH_STRING == "" ]]; then + VAR_WATCH_STRING+="$VARNAME=$VALUE " + else + VAR_WATCH_STRING+=": $VARNAME=$VALUE " + fi + done + + OUTPUT_MESSAGE="$DATE : $HOSTNAME : $LEVEL : $VAR_WATCH_STRING : $MESSAGE" + else + OUTPUT_MESSAGE="$DATE : $HOSTNAME : $LEVEL : $MESSAGE" + fi + + echo -e "$OUTPUT_MESSAGE" + fi +} >&2 usage () { cat <