#!/usr/bin/env bash # echo "entering: ${BASH_SOURCE[0]}" # echo "remove all echos to preseve output" # echo "" # export PS4='\e[90m+${LINENO} in ${#BASH_SOURCE[@]}>${FUNCNAME[0]}:${BASH_SOURCE[@]##*/} \e[0m' # set -x log.device() { local device=$1 if [ -z "$device" ]; then device=/dev/tty fi export LOG_DEVICE=$device echo "initializing logging to $LOG_DEVICE" >>$LOG_DEVICE RETURN_VALUE="$?" if [ $RETURN_VALUE -eq 1 ]; then old_log_device=$LOG_DEVICE export LOG_DEVICE=/dev/stderr echo " Tried to initialize logging to $old_log_device and failed" >>$LOG_DEVICE echo " logging over ssh (or other non-tty) ... using $LOG_DEVICE" >>$LOG_DEVICE fi } log.init() { local device=$1 if [ -z "$device" ]; then device=/dev/tty fi export LOG_DEVICE=$device echo "initializing logging to $LOG_DEVICE" >>$LOG_DEVICE RETURN_VALUE="$?" if [ $RETURN_VALUE -eq 1 ]; then old_log_device=$LOG_DEVICE export LOG_DEVICE=/dev/stderr echo " Tried to initialize logging to $old_log_device and failed" >>$LOG_DEVICE echo " logging over ssh (or other non-tty) ... using $LOG_DEVICE" >>$LOG_DEVICE fi } log.init() { local level=$1 if [ "$level" = "localInstall" ] || ! this.isNumber $level; then level=3 fi if [ -z "$CONFIG" ]; then CONFIG=~/config/user.env source $CONFIG source $OOSH_DIR/config log.init.colors fi echo "initializing logging to $LOG_DEVICE" >>$LOG_DEVICE RETURN_VALUE="$?" if [ $RETURN_VALUE -eq 1 ]; then export LOG_DEVICE=/dev/stderr echo " logging over ssh ... using $LOG_DEVICE" #config save log LOG fi if [ -n "$level" ]; then export LOG_LEVEL="$level" important.log "log level changed to $LOG_LEVEL" else export LOG_LEVEL=3 fi important.log "log initialized on level $LOG_LEVEL" } if ! [ "$(type -t info.log)" = "function" ]; then source $(dirname ${BASH_SOURCE[0]})/this fi test.console.log() { seq.puml.log if [ -n "$LOG_LIVE" ] \ && [ "$LOG_LEVEL" -gt "0" ]; then echo -e "${NO_COLOR}log: ${BASH_SOURCE[0]##*/} -> ${BASH_SOURCE[1]##*/}: ${FUNCNAME[0]}:${LINENO} - ${BASH_SOURCE[@]##*/} >$*${NORMAL}" | tee -a ~/config/result.txt >>$LOG_LIVE fi if [ "$LOG_LEVEL" -gt "0" ]; then echo -e "${NO_COLOR}$*" >>$LOG_DEVICE fi } console.log() { seq.puml.log if [ -n "$LOG_LIVE" ] \ && [ "$LOG_LEVEL" -gt "0" ]; then echo -e "${NO_COLOR}log: ${BASH_SOURCE[0]##*/} -> ${BASH_SOURCE[1]##*/}: ${FUNCNAME[0]}:${LINENO} - ${BASH_SOURCE[@]##*/} >$*${NORMAL}" | tee -a ~/config/result.txt >>$LOG_LIVE fi if [ "$LOG_LEVEL" -gt "2" ]; then echo -e "${NO_COLOR}$*" >>$LOG_DEVICE fi } seq.puml.log() { { if [ "$LOG_LEVEL" -gt "5" ]; then set -x export PS4='\e[90m ${BASH_SOURCE[0]##*/} -> ${BASH_SOURCE[1]##*/}: ${FUNCNAME[0]}:${LINENO} - ${BASH_SOURCE[@]##*/} \e[0m' pumlPrefix='echo \"${BASH_SOURCE[0]##*/} -> ${BASH_SOURCE[1]##*/}: ${FUNCNAME[0]}:${LINENO} - \"' if [ "$LOG_LEVEL" -gt "6" ]; then export STEP_DEBUG=ON else export STEP_DEBUG=OFF fi else # TODO cleanup PS4 # pumlPrefix="" # export PS4='\e[90m+${LINENO} in ${#BASH_SOURCE[@]}>${FUNCNAME[0]}:${BASH_SOURCE[@]##*/} \e[0m' pumlPrefix='echo \"${BASH_SOURCE[0]##*/} -> ${BASH_SOURCE[1]##*/}: ${FUNCNAME[0]}:${LINENO} - \"' export PS4='\e[90m ${BASH_SOURCE[0]##*/} -> ${BASH_SOURCE[1]##*/}: ${FUNCNAME[0]}:${LINENO} - ${BASH_SOURCE[@]##*/} \e[0m' #put back #set +x fi } 2>/dev/null } silent.log() { seq.puml.log 2>/dev/null if [ -n "$LOG_LIVE" ] \ && [ "$LOG_LEVEL" -gt "1" ]; then echo -e "${GRAY}-: ${BASH_SOURCE[0]##*/} -> ${BASH_SOURCE[1]##*/}: ${FUNCNAME[0]}:${LINENO} - ${BASH_SOURCE[@]##*/} ${GRAY}> $*${NORMAL}" | tee -a ~/config/error.txt >>$LOG_LIVE ## cyan fi if [ "$LOG_LEVEL" -gt "2" ]; then echo -e "${GRAY} $*${NORMAL}" >>$LOG_DEVICE fi } success.log() { seq.puml.log 2>/dev/null if [ -n "$LOG_LIVE" ] \ && [ "$LOG_LEVEL" -gt "1" ]; then echo -e "${BOLD_GREEN}SUCCESS: ${GRAY}${BASH_SOURCE[0]##*/} -> ${BASH_SOURCE[1]##*/}: ${FUNCNAME[0]}:${LINENO} - ${BASH_SOURCE[@]##*/} ${BOLD_GREEN}> $*${NORMAL}" | tee -a ~/config/result.txt >>$LOG_LIVE ## cyan fi if [ "$LOG_LEVEL" -gt "2" ]; then echo -e "${BOLD_GREEN}SUCCESS> $*${NORMAL}" >>$LOG_DEVICE fi } test.success.log() { seq.puml.log 2>/dev/null if [ "$LOG_LEVEL" -gt "0" ]; then echo -e "${BOLD_GREEN}SUCCESS> $*${NORMAL}" fi } error.details.log() { seq.puml.log 2>/dev/null if [ "$LOG_LEVEL" -gt "0" ]; then echo -e "${NORMAL}$*" fi } warn.log() { seq.puml.log 2>/dev/null if [ -n "$LOG_LIVE" ] \ && [ "$LOG_LEVEL" -gt "1" ]; then echo -e "${BOLD_YELLOW}WARNING: $(date) ${COLOR_GRAY}${BASH_SOURCE[0]##*/} -> ${BASH_SOURCE[1]##*/}: ${FUNCNAME[0]}:${LINENO} - ${BASH_SOURCE[@]##*/} ${BOLD_YELLOW}> $*${NORMAL}" | tee -a ~/config/error.txt >>$LOG_LIVE ## cyan fi if [ "$LOG_LEVEL" -gt "1" ]; then echo -e "${BOLD_YELLOW}WARNING> $*${NORMAL}" fi { shift RETURN=$1 } 2>/dev/null } important.log() { seq.puml.log 2>/dev/null if [ -n "$LOG_LIVE" ] \ && [ "$LOG_LEVEL" -gt "1" ]; then echo -e "${BOLD_CYAN}IMPORTANT: ${COLOR_GRAY}${BASH_SOURCE[0]##*/} -> ${BASH_SOURCE[1]##*/}: ${FUNCNAME[0]}:${LINENO} - ${BASH_SOURCE[@]##*/} ${BOLD_CYAN}> $*${NORMAL}" >>$LOG_LIVE ## cyan fi if [ "$LOG_LEVEL" -gt "1" ]; then echo -e "${BOLD_CYAN}IMPORTANT> $*${NORMAL}" >>$LOG_DEVICE fi { shift RETURN=$1 } 2>/dev/null } problem.log() { seq.puml.log 2>/dev/null if [ "$LOG_LEVEL" -gt "1" ]; then echo -e "${BOLD_RED}PROBLEM BREAKPOINT> $*${NORMAL}" #>>$LOG_DEVICE export STEP_DEBUG=ON fi } debug.log() { seq.puml.log 2>/dev/null if [ -n "$LOG_LIVE" ] \ && [ "$LOG_LEVEL" -gt "1" ]; then echo -e "${BOLD_CYAN}-: ${COLOR_GRAY}${BASH_SOURCE[0]##*/} -> ${BASH_SOURCE[1]##*/}: ${FUNCNAME[0]}:${LINENO} - ${BASH_SOURCE[@]##*/} ${BOLD_CYAN}> $*${NORMAL}" >>$LOG_LIVE fi if [ "$LOG_LEVEL" -gt "4" ]; then echo -e "${XXXX}${BOLD_CYAN}- $*${NORMAL}" >>$LOG_DEVICE fi } stop.log() { seq.puml.log 2>/dev/null if [ -n "$LOG_LIVE" ] \ && [ "$LOG_LEVEL" -gt "1" ]; then echo -e "${BOLD_GREEN}BREAKPOINT: $(date) ${COLOR_GRAY}${BASH_SOURCE[0]##*/} -> ${BASH_SOURCE[1]##*/}: ${FUNCNAME[0]}:${LINENO} - ${BASH_SOURCE[@]##*/} ${BOLD_GREEN}> $*${NORMAL}" | tee -a ~/config/error.txt >>$LOG_LIVE ## cyan fi if [ "$LOG_LEVEL" -gt "3" ]; then echo -e "${BOLD_GREEN}BREAKPOINT> $*${NORMAL}" >>$LOG_DEVICE export STEP_DEBUG=ON fi } error.log() { err.log "$@" } err.log() { if [ -z "$CONFIG" ]; then CONFIG=~/config/user.env source $CONFIG fi seq.puml.log if [ -n "$LOG_LIVE" ]; then echo -e "${BOLD_RED}ERROR: $(date) ${BOLD_WHITE}${BASH_SOURCE[0]##*/} -> ${BASH_SOURCE[1]##*/}: ${FUNCNAME[0]}:${LINENO} - ${BASH_SOURCE[@]##*/} ${BOLD_RED}> $*${NORMAL}" | tee -a ~/config/error.txt ~/config/result.txt >>$LOG_LIVE fi if [ "$LOG_LEVEL" -gt 0 ]; then echo -e "${BOLD_RED}ERROR> $*${NORMAL}" >>$LOG_DEVICE fi # seq.puml.log if [ "$LOG_LEVEL" -gt "4" ]; then export STEP_DEBUG=ON fi } capture.log() { clear.resultFiles important.log "capturing logs of: $*" #### write to console AND result.text AND write errors to errot.txt AND result.txt "$@" > >(tee -a $CONFIG_PATH/result.txt) 2> >(tee -a ~/config/result.txt ~/config/error.txt >&2) } capture.log.silent() { clear.resultFiles important.log "capturing logs of: $* use ${WHITE}log inspect${CYAN} in another shell to see whats going on. waiting for results... " #### write to console AND result.text AND write errors to errot.txt AND result.txt "$@" >$CONFIG_PATH/result.txt 2> >(tee -a $CONFIG_PATH/result.txt $CONFIG_PATH/error.txt >&2) important.log " results ready in: $CONFIG_PATH/result.txt" } log.capture.result() { capture.log "$@" } log.capture.result.silent() { capture.log.silent "$@" } log.inspect() { tail -f $CONFIG_PATH/result.txt } log.inspect.errors() { tail -f $CONFIG_PATH/error.txt } clear.resultFiles() { cd $CONFIG_PATH if [ -f result.txt ]; then rm result.txt else silet.log "result.txt already clean" fi if [ -f error.txt ]; then rm error.txt else silet.log "error.txt already clean" fi success.log "result log files cleared" cd - } # log.noop() # { # return 0 # } log.level.completion.levelno() { echo "1 2 3 4 5 6" } log.level() { # # switch to a specific log level if [ -n "$1" ]; then local level=$1 if [ "$level" = "reset" ]; then local current=$LOG_LEVEL export LOG_LEVEL=$LOG_LEVEL_RESET export LOG_LEVEL_RESET=$current else export LOG_LEVEL_RESET=$LOG_LEVEL export LOG_LEVEL="$1" important.log "log level changed to $LOG_LEVEL" check.debug.level fi if [ "$(type -t this.isSourced)" = "function" ]; then if (this.isSourced); then info.log "log level sourced" else info.log "log level started" if [ -z "$LOG_DEVICE" ]; then export LOG_DEVICE=/dev/tty fi this.call config save log LOG exit 0 #config add log fi else important.log "should not happen: this.isSourced is not defined....continuing" fi shift export RETURN=$1 else this=${0##*/} RESULT="export LOG_LEVEL=$LOG_LEVEL" RETURN="$1" echo "$RESULT" if [ "$this" = "log" ]; then debug.log "$this was started" exit 0 else debug.log "$this was sourced" fi fi # LOG_LEVEL=6 # check.debug.level } log.live() { # # set the log device tail -f $LOG_LIVE } log.clear.liveLog() { # # set the log device local file=$1 if [ -z $file ]; then file=$LOG_LIVE fi log.clear.scrollbackBuffer >$file echo "# clear log $file... -------------- $(date)--------------------" >$file log.clear.scrollbackBuffer echo "# clear log $file -------------- $(date)--------------------" ls -l $file } log.clear.screen() { echo -ne '\033c' # clear screen: https://unix.stackexchange.com/questions/375743/why-clear-do-not-clear-whole-screen/375784#375784 } log.clear.scrollbackBuffer() { log.clear.screen echo -ne '\033[3J' # clear scrollback buffer: https://invisible-island.net/ncurses/man/clear.1.html } log.clear.all() { log.clear.liveLog ~/config/result.txt log.clear.liveLog ~/config/error.txt log.clear.liveLog #log.clear.scrollbackBuffer } log.live.file() { # # set the log live file if [ -n "$1" ]; then export LOG_LIVE=$1 important.log "new LOG_LIVE=$LOG_LIVE" this.call config save log LOG else console.log "LOG_LIVE=$LOG_LIVE" fi } log.live.result() { # # shows live intermediate results tail -f ~/config/result.txt } log.live.error() { # # shows live errors tail -f ~/config/error.txt } log.device() { # # set the log device if [ -n "$1" ]; then export LOG_DEVICE=$1 important.log "new LOG_DEVICE=$LOG_DEVICE" this.call config save log LOG else important.log "LOG_DEVICE=$LOG_DEVICE" fi } log.init.colors() { if [ -z "$CONFIG_PATH" ]; then warn.log "no color yet" >>/dev/tty return 1 fi if [ -f $CONFIG_PATH/setup.color.env ]; then source $CONFIG_PATH/setup.color.env fi } log.usage() { local this=${0##*/} echo "You started: $this Usage: $this: command important.log success.log console.log warn.log error.log info.log debug.log stop.log silent.log Examples $this level <0...7> for live logging open another shell and start there in each $this live $this live.error $this live.result clear the live log with $this clear.liveLog live log file currently is: $LOG_LIVE " } log.start() { #echo "log startet" if [ -z "$LOG_LEVEL" ]; then log.init $1 else local command=$1 seq.puml.log #log.init.colors # if [ -z "$command" ]; then # command="level" # fi this=${0##*/} if [ "$this" = "log" ]; then debug.log "$this was started" else return 0 fi if [ -n "$command" ]; then if (this.functionExists log.$command); then shift log.$command "$@" # else # if ! [ "$command" = "silent" ]; then # console.log "$@" # fi fi if (this.functionExists $command.log); then shift $command.log "$@" # else # if ! [ "$command" = "silent" ]; then # console.log "$@" # fi fi else log.usage exit 0 fi #if [ "$(type -t this.init)" = "function" ]; then #result 0 "export LOG_LEVEL=$LOG_LEVEL" "$1" >/dev/null #else RETURN_VALUE=0 RESULT="export LOG_LEVEL=$LOG_LEVEL" RETURN="$1" #fi return $RETURN_VALUE fi # check.debug.level # create.result 0 "export LOG_LEVEL=$LOG_LEVEL" "$1" >/dev/null # return $(result) } log.start "$@" # console.log " # console.log: still in ${BASH_SOURCE[0]##*/} # "