From 5529f53e41b7f22ae707720e839bf98ae1f15736 Mon Sep 17 00:00:00 2001 From: Miatec Date: Sat, 4 Jan 2020 22:22:59 +0100 Subject: [PATCH] Implementing issue #1 "Colors on terminal". --- README.md | 5 ++++- src/logger.sh | 54 +++++++++++++++++++++++++++++++++++++++++++++++--- test/logger.sh | 50 ++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 105 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index d3a65e3..9f0adc5 100644 --- a/README.md +++ b/README.md @@ -27,9 +27,12 @@ bpkg install adoyle/shell-logger ## Usage -Only print message to `stdout`: `source logger.sh ""`. +Only print message to `stdout`: `source logger.sh ""`. +*Note: It will print lines in color according the level (e.g. ERROR in red, WARN in orange and so on)* Print message to `stdout` and write it to a file: `source logger.sh ""`. +*Note: No color of line in this mode* + ## API diff --git a/src/logger.sh b/src/logger.sh index feebd76..fd90820 100644 --- a/src/logger.sh +++ b/src/logger.sh @@ -14,6 +14,25 @@ # - http://www.cubicrace.com/2016/03/efficient-logging-mechnism-in-shell.html +####################################################################### +# Constants # +####################################################################### +BASH_COLOR_CODE_RED="\e[31m" +BASH_COLOR_CODE_YELLOW="\e[33m" +BASH_COLOR_CODE_GREEN="\e[32m" +BASH_COLOR_CODE_BLUE="\e[34m" +BASH_COLOR_CODE_DEFAULT="\e[39m" + +declare -A ARRAY_LEVEL_COLOR=( \ + [ENTER]=$BASH_COLOR_CODE_DEFAULT \ + [EXIT]=$BASH_COLOR_CODE_DEFAULT \ + [DEBUG]=$BASH_COLOR_CODE_DEFAULT \ + [INFO]=$BASH_COLOR_CODE_BLUE \ + [WARN]=$BASH_COLOR_CODE_YELLOW \ + [ERROR]=$BASH_COLOR_CODE_RED \ + [SUCCESS]=$BASH_COLOR_CODE_GREEN \ +) + ####################################################################### # initialization # ####################################################################### @@ -30,11 +49,14 @@ fi ####################################################################### function _echo() { - local msg=$1 + local msg=$2 + local level=$1 + if [[ -n "$LOG_TARGET" ]] ;then echo "$msg" | tee >> "$LOG_TARGET" else - echo "$msg" + local levelColor=$(_getLevelColor $level) + echo -e "${levelColor}${msg}${BASH_COLOR_CODE_DEFAULT}" fi } @@ -52,7 +74,7 @@ function _log() { level="${2-${FUNCNAME[1]}}" date_time=$(_date_time) function_name="${FUNCNAME[2]}" - _echo "[$date_time][$level]($function_name) $msg" + _echo $level "[$date_time][$level]($function_name) $msg" } function _CTX() { @@ -72,7 +94,28 @@ function _CTX() { echo "${ctx[@]}" } +function _levelExists(){ + local level=$1 + if [[ "${ARRAY_LEVEL_COLOR[$level]+isset}" ]]; then + return 0 + else + return 1 + fi +} +function _getLevelColor(){ + local level=$1 + _levelExists $level + local levelExists=$? + + if [[ "$levelExists" == "0" ]]; then + echo ${ARRAY_LEVEL_COLOR["$level"]} + else + echo $BASH_COLOR_CODE_DEFAULT + fi + + +} ####################################################################### # public methods # ####################################################################### @@ -104,3 +147,8 @@ function WARN() { function ERROR() { _log "$1" } + +function SUCCESS() { + _log "$1" +} + diff --git a/test/logger.sh b/test/logger.sh index 5b43370..be0acb5 100755 --- a/test/logger.sh +++ b/test/logger.sh @@ -7,6 +7,24 @@ set -o pipefail CUR_FILE_DIR="$(cd "$( dirname "$0" )" && pwd)" + + +function loggerShCheck() +{ + # bash -n check the syntax of logger.sh. + # If there is an error, it will stop the test script right now. + bash -n "$CUR_FILE_DIR"/../src/logger.sh "" + + if [[ "$?" == 0 ]]; then + echo "logger.sh does not have syntax error" + fi +} + +loggerShCheck + + + + source "$CUR_FILE_DIR"/../src/logger.sh "" function foo() { @@ -16,9 +34,41 @@ function foo() { echo "echo message" WARN "WARN message" ERROR "ERROR message" + SUCCESS "SUCCESS message" EXIT } + + + +function colorCheck() { + local levelColor=$(_getLevelColor EXIT) + echo "EXIT has color code $levelColor" + + levelColor=$(_getLevelColor ENTER) + echo "ENTER has color code $levelColor" + + levelColor=$(_getLevelColor DEBUG) + echo "DEBUG has color code $levelColor" + + levelColor=$(_getLevelColor INFO) + echo "INFO has color code $levelColor" + + levelColor=$(_getLevelColor WARN) + echo "WARN has color code $levelColor" + + levelColor=$(_getLevelColor ERROR) + echo "ERROR has color code $levelColor" + + local levelColor=$(_getLevelColor "unexpectedLevel") + echo "unexpectedLevel has color code $levelColor" +} + + + +colorCheck + + ENTER foo