All Downloads are FREE. Search and download functionalities are using the official Maven repository.

refcodes-batch.0.3.0.source-code.lib-logging.inc Maven / Gradle / Ivy

There is a newer version: 1.0.5
Show newest version
#!/bin/bash

# ------------------------------------------------------------------------------
# This lib relies on the "apply.sh" / "lib-common.inc" shell script.
# ------------------------------------------------------------------------------

# ------------------------------------------------------------------------------
# Log levels for logging:
# ------------------------------------------------------------------------------
DEBUG=0
INFO=1
WARN=2
ERROR=3
FATAL=4

# ANSI colors:

RED="\E[31m"
GREEN="\E[32m"
YELLOW="\E[33m"
BLUE="\E[34m"
MAGENTA="\E[35m"
CYAN="\E[36m"
WHITE="\E[37m"
BOLD_ON="\E[1m"
BOLD_OFF="\E[22m"

CLEAR_FORMAT="\E[0m"

# ------------------------------------------------------------------------------
# Sets the color to use when prining text to the terminal.
#
# $1: The color to use
# ------------------------------------------------------------------------------
function setForegroundColor {
	if [[ $# != 1 ]] ; then
		showError "Wrong number of arguments: The function \"setColor\" expects one argument !!!"
		exit $EXIT_BUG
	fi
	color="$1"
	if [[ "$color" == "red" ]] ; then 
		echo -en "$RED"
	elif [[ "$color" == "green" ]] ; then 
		echo -en "$GREEN"
	elif [[ "$color" == "yellow" ]] ; then 
		echo -en "$YELLOW"
	elif [[ "$color" == "blue" ]] ; then 
		echo -en "$BLUE"
	elif [[ "$color" == "magenta" ]] ; then 
		echo -en "$MAGENTA"
	elif [[ "$color" == "cyan" ]] ; then 
		echo -en "$CYAN"
	elif [[ "$color" == "white" ]] ; then 
		echo -en "$WHITE"
	else
		showError "Wrong argument: The function \"setForegroundColor\" expects a known color as argument !!!"
	fi
}

# ------------------------------------------------------------------------------
# Sets the color to use when prining text to the terminal.
#
# $1: '0' = bold is off, '1' = bold is on
# ------------------------------------------------------------------------------
function setBold {
	if [[ $# != 1 ]] ; then
		showError "Wrong number of arguments: The function \"setBold\" expects one argument !!!"
		exit $EXIT_BUG
	fi

	bold="$1"
	if [[ "$bold" == "1" ]] ; then 
		echo -en "$BOLD_ON"
	elif [[ "$bold" == "0" ]] ; then 
		echo -en "$BOLD_OFF"
	else
		showError "Wrong argument: The function \"setBold\" expects '0' ( = off ) of '1' ( = on ) argument !!!"
	fi
}

# ------------------------------------------------------------------------------
# Resets the color to use to the default terminal color.
# ------------------------------------------------------------------------------
function resetFormat {

	if [[ $# != 0 ]] ; then
		showError "Too many arguments: The function \"resetFormat\" expects none arguments !!!"
		exit $EXIT_BUG
	fi

	tput sgr0
}

# ------------------------------------------------------------------------------
# Logs out a plain line feed.
# ------------------------------------------------------------------------------
function logLineFeed {

	if [[ $# != 0 ]] ; then
		showError "Too many arguments: The function \"logLineFeed\" expects none arguments !!!"
		exit $EXIT_BUG
	fi

	echo "" >&2
}

# ------------------------------------------------------------------------------
# Logs a line with the given char and the width of the current terminal (if no 
# explicit width was specified) or 80 if none with was specified.
#
# $1: The char to use
# $2: The width to use (optional)
# ------------------------------------------------------------------------------
function logLine {
	if [[ $# > 2 ]] ; then
		showError "Too many arguments: The function \"logLine\" expects at most two arguments !!!"
		exit $EXIT_BUG
	fi

	char="$1"
	width="$2"
	if [[ $width == '' ]] ; then
		width="$(tput cols)"
		if [[ $? != 0 ]] ; then
			width="80"
		fi
		if [[ $LOG_LINE_WIDTH > '0' ]] ; then
			width="$LOG_LINE_WIDTH"
		fi
	fi

	for (( i=0 ; i < $width ; i++ )); do echo -n "$char" >&2 ; done
	echo "" >&2
}
# ------------------------------------------------------------------------------
# Logs a separator line
# ------------------------------------------------------------------------------
function logSeparator {
	if [[ $# != 0 ]] ; then
		showError "Too many arguments: The function \"logSeparator\" expects none arguments !!!"
		exit $EXIT_BUG
	fi
	setForegroundColor "white"
	logLine "-"
	resetFormat
}

# ------------------------------------------------------------------------------
# Logs a title with a bold separator on top and on bottom:
#
# $1: The title text
# ------------------------------------------------------------------------------
function logTitle {
	if [[ $# != 1 ]] ; then
		showError "Wrong number of arguments: The function \"logTitle\" expects one argument !!!"
		exit $EXIT_BUG
	fi

	logLineFeed
	text="$1"
	setBold "1"
	setForegroundColor "magenta"
	logLine "#"
	echo -n "# " >&2
	setForegroundColor "white"
	echo "$text" >&2
	setForegroundColor "magenta"
	logLine "#"
	resetFormat
}

# ------------------------------------------------------------------------------
# Logs a title with a bold separator on top and on bottom:
#
# $1: The title text
# ------------------------------------------------------------------------------
function logHeadline {
	if [[ $# != 1 ]] ; then
		showError "Wrong number of arguments: The function \"logSubTitle\" expects one argument !!!"
		exit $EXIT_BUG
	fi

	logLineFeed
	text="$1"
	setBold "1"
	setForegroundColor "yellow"
	logLine "="
	echo -n "= " >&2
	setForegroundColor "white"
	echo "$text" >&2
	setForegroundColor "yellow"
	logLine "="
	resetFormat
}

# ------------------------------------------------------------------------------
# Sets the log level for the logs to be logged. The log level may be $DEBUG,
# $INFO, $WARN, $FATAL.
#
# $1: The log level.
# ------------------------------------------------------------------------------
function setLogLevel {
	if [[ $# != 1 ]] ; then
		showError "Wrong number of arguments: The function \"setLogLevel\" expects one argument !!!"
		exit $EXIT_BUG
	fi
	LOG_LEVEL=$1
}

# ------------------------------------------------------------------------------
# Sets the log file for the logs to be logged
#
# $1: The log file where to log to.
# ------------------------------------------------------------------------------
function setLogFile {
	if [[ $# != 1 ]] ; then
		showError "Wrong number of arguments: The function \"setLogFile\" expects one argument !!!"
		exit $EXIT_BUG
		LOG_FILE=$1
	fi
}

# ------------------------------------------------------------------------------
# Log a message: First argument is the loglevel in case two arguments were 
# passed,then the second is the message. In case of one argument, then the first  
# is the message which is logged as logLevel $INFO.
#
# $1: The message (one argument), logLevel (two arguments)
# $2: The message (in case of two arguments) 
# ------------------------------------------------------------------------------
function log {
	
	if [[ $# -eq 1 ]] ; then
		logLevel="$INFO"
		message="$1"
	elif [[ $# -eq 2 ]] ; then
		logLevel="$1"
		message="$2"
	else
		showError "Wrong number of arguments: The function \"log\" expects at least one and at most two arguments !!!"
		exit $EXIT_BUG
	fi
	
	if [[ "$logLevel" != "$DEBUG" &&  "$logLevel" != "$INFO" && "$logLevel" != "$WARN" && "$logLevel" != "$ERROR" && "$logLevel" != "$FATAL" ]] ; then
		showError "Wrong usage: The function \"log\" expects valid \"logLevel\" argument (you provided \"$logLevel\" !!!"
		exit $EXIT_BUG
	fi
	
	if [[ "$logLevel" -ge "$LOG_LEVEL" ]] ; then 
		if [[ "$logLevel" == "$DEBUG" ]] ; then
			logLevelText="DEBUG"
			logLevelAnsiText="${YELLOW}DEBUG${CLEAR_FORMAT}"
		elif [[ "$logLevel" == "$INFO" ]] ; then
			logLevelText="INFO"
			logLevelAnsiText="${WHITE}INFO${CLEAR_FORMAT}"
		elif [[ "$logLevel" == "$WARN" ]] ; then
			logLevelText="WARN"
			logLevelAnsiText="${CYAN}WARN${CLEAR_FORMAT}"
		elif [[ "$logLevel" == "$ERROR" ]] ; then
			logLevelText="ERROR"
			logLevelAnsiText="${RED}${BOLD_ON}ERROR${CLEAR_FORMAT}"
		elif [[ "$logLevel" == "$FATAL" ]] ; then
			logLevelText="FATAL"
			logLevelAnsiText="${MAGENTA}${BOLD_ON}FATAL${CLEAR_FORMAT}"
		fi
	
		if [[ "$VERBOSE" = "y" || "${LOG_FILE}" == "" ]] ; then
			echo -e "$(date '+%Y-%m-%d %H:%M:%S')\t$logLevelAnsiText\t$message"
		fi
	
		if [[ "${LOG_FILE}" != "" ]] ; then
			# rotate LOG_FILE if required, ignore any errors
			local MODDATE=$( date -r ${LOG_FILE} +%F 2>/dev/null )
			local TODAY=$( date +%F 2>/dev/null )
			local ROTATED_LOG_FILE=$( dirname ${LOG_FILE} 2>/dev/null )/$( basename ${LOG_FILE} 2>/dev/null ).${MODDATE}
			if [ "${MODDATE}" != "${TODAY}" ] && [ ! -e "${RENAMED_LOG_FILE}" ] && [ ! -e "${RENAMED_LOG_FILE}.gz" ]; then
				mv -f "${LOG_FILE}" "${ROTATED_LOG_FILE}" 2>/dev/null
				if [ "$?"="0" ] ; then
					gzip -f "${ROTATED_LOG_FILE}" 2>/dev/null
				fi
			fi	
			
			# append message to logfile
			touch "${LOG_FILE}" 2>/dev/null
			chmod a+rw "{LOG_FILE}" 2>/dev/null
			echo -e "$(date '+%Y-%m-%d %H:%M:%S')\t$logLevelText\t$message" 1>>${LOG_FILE} 2>/dev/null ;
			if [ $? -ne 0 ] ; then
				echo -e "$(date '+%Y-%m-%d %H:%M:%S')\t$logLevelText\t$message" 2>&1
			fi
		fi
	fi
}

# ------------------------------------------------------------------------------
# Show error:
# ------------------------------------------------------------------------------
function showError {
	if [ -z "$1" ] ; then
		echo "Argument missing: The function \"showError\" expects an argument !!!" >&2
		logSeparator
		exit $EXIT_BUG
	fi
	setForegroundColor "red"
	echo "ERROR >>> $1" >&2
	logSeparator
}

# ------------------------------------------------------------------------------
# Show warning:
# ------------------------------------------------------------------------------
function showWarning {
	if [ -z "$1" ] ; then
		echo "Argument missing: The function \"showWarning\" expects an argument !!!" >&2
		logSeparator
		exit $EXIT_BUG
	fi
	setForegroundColor "cyan"
	echo "WARNING >>> $1" >&2
	logSeparator
}

# ------------------------------------------------------------------------------
# Show success:
# ------------------------------------------------------------------------------
function showSuccess {
	if [ -z "$1" ] ; then
		echo "Argument missing: The function \"showSuccess\" expects an argument !!!" >&2
		logSeparator
		exit $EXIT_BUG
	fi
	setForegroundColor "green"
	echo "SUCCESS >>> $1" >&2
	logSeparator
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy