From c35db6b46ffaa5e4e03194d371b26061864e88e2 Mon Sep 17 00:00:00 2001 From: XargonWan Date: Thu, 28 Nov 2024 15:06:21 +0900 Subject: [PATCH] LOGGER: actual implementation of log levels --- functions/logger.sh | 138 ++++++++++++++++++++------------------------ 1 file changed, 63 insertions(+), 75 deletions(-) diff --git a/functions/logger.sh b/functions/logger.sh index d628dd7c..b2f1aecf 100755 --- a/functions/logger.sh +++ b/functions/logger.sh @@ -1,99 +1,87 @@ -# SORRY, I WILL CLEAN UP THIS -# -Xargon - # This script provides a logging function 'log' that can be sourced in other scripts. -# It logs messages to both the terminal and a specified logfile, allowing different log levels. -# The log function takes three parameters: log level, log message, and optionally the logfile. If no logfile is specified, it writes to retrodeck/logs/retrodeck.log - +# It logs messages to both the terminal and a specified logfile, supporting multiple log levels. +# The log function takes three parameters: log level, log message, and optionally the logfile. If no logfile is specified, it writes to retrodeck/logs/retrodeck.log. +# +# Supported logging levels (controlled by the variable 'logging_level'): +# - none: No logs are produced. +# - info: Logs informational messages (i) and errors (e). +# - warn: Logs warnings (w), informational messages (i), and errors (e). +# - debug: Logs all message types (d, w, i, e). +# # Type of log messages: -# log d - debug message: maybe in the future we can decide to hide them in main builds or if an option is toggled -# log i - normal informational message -# log w - waring: something is not expected but it's not a big deal -# log e - error: something broke - +# - d: Debug message (logged only in debug level). +# - i: Informational message (logged in debug, info, and warn levels). +# - w: Warning message (logged in debug and warn levels). +# - e: Error message (logged in all levels except none). +# # Example usage: -# log w "foo" -> logs a warning with message foo in the default log file retrodeck/logs/retrodeck.log -# log e "bar" -> logs an error with message bar in the default log file retrodeck/logs/retrodeck.log -# log i "par" rekku.log -> logs an information with message in the specified log file inside the logs folder retrodeck/logs/rekku.log +# log w "foo" -> Logs a warning with message "foo" to the default log file retrodeck/logs/retrodeck.log. +# log e "bar" -> Logs an error with message "bar" to the default log file retrodeck/logs/retrodeck.log. +# log i "baz" rekku.log -> Logs an informational message "baz" to the specified log file retrodeck/logs/rekku.log. +# +# The function auto-detects if the shell is sh and avoids colorizing the output in that case. log() { - if [[ ! $logging_level == "none" ]]; then + # Exit early if logging_level is "none" + if [[ $logging_level == "none" ]]; then + return + fi - local level="$1" - local message="$2" - local timestamp="$(date +[%Y-%m-%d\ %H:%M:%S.%3N])" - local colorize_terminal + local level="$1" # Logging level of the current message + local message="$2" # Message to log + local timestamp="$(date +[%Y-%m-%d\ %H:%M:%S.%3N])" # Timestamp for the log entry + local logfile="${3:-$rd_logs_folder/retrodeck.log}" # Log file, default to retrodeck.log + local colorize_terminal=true - # Use specified logfile or default to retrodeck.log - local logfile - if [ -n "$3" ]; then - logfile="$3" - else - logfile="$rd_logs_folder/retrodeck.log" - fi + # Check if the shell is sh (not bash or zsh) to avoid colorization + if [ "${SHELL##*/}" = "sh" ]; then + colorize_terminal=false + fi - # Check if the shell is sh (not bash or zsh) to avoid colorization - if [ "${SHELL##*/}" = "sh" ]; then - colorize_terminal=false - else - colorize_terminal=true - fi + # Function to check if the current message level should be logged + should_log() { + case "$logging_level" in + debug) return 0 ;; # Always log everything + info) [[ "$level" == "i" || "$level" == "e" ]] && return 0 ;; + warn) [[ "$level" != "d" ]] && return 0 ;; + error) [[ "$level" == "e" ]] && return 0 ;; + esac + return 1 + } + if should_log; then + # Define message colors based on level case "$level" in d) - if [[ $logging_level == "debug" ]]; then - if [ "$colorize_terminal" = true ]; then - # Debug (green) for terminal - colored_message="\e[32m[DEBUG] $message\e[0m" - else - # Debug (no color for sh) for terminal - colored_message="$timestamp [DEBUG] $message" - fi - # Write to log file without colorization - log_message="$timestamp [DEBUG] $message" - fi + color="\e[32m[DEBUG]" + prefix="[DEBUG]" ;; - e) - if [[ $logging_level == "debug" || $logging_level == "error" ]]; then - if [ "$colorize_terminal" = true ]; then - # Error (red) for terminal - colored_message="\e[31m[ERROR] $message\e[0m" - else - # Error (no color for sh) for terminal - colored_message="$timestamp [ERROR] $message" - fi - # Write to log file without colorization - log_message="$timestamp [ERROR] $message" - fi + e) + color="\e[31m[ERROR]" + prefix="[ERROR]" ;; w) - if [[ $logging_level == "debug" || $logging_level == "error" || $logging_level == "warn" ]]; then - if [ "$colorize_terminal" = true ]; then - # Warning (yellow) for terminal - colored_message="\e[33m[WARN] $message\e[0m" - else - # Warning (no color for sh) for terminal - colored_message="$timestamp [WARN] $message" - fi - # Write to log file without colorization - log_message="$timestamp [WARN] $message" - fi + color="\e[33m[WARN]" + prefix="[WARN]" ;; i) - if [[ $logging_level == "debug" || $logging_level == "error" || $logging_level == "warn" || $logging_level == "info" ]]; then - # Write to log file without colorization for info message - log_message="$timestamp [INFO] $message" - colored_message=$log_message - fi + color="\e[34m[INFO]" + prefix="[INFO]" ;; *) - # Default (no color for other shells) for terminal - colored_message="$timestamp $message" - # Write to log file without colorization - log_message="$timestamp $message" + color="\e[37m[LOG]" + prefix="[LOG]" ;; esac + # Construct the log message + if [ "$colorize_terminal" = true ]; then + colored_message="$color $message\e[0m" + else + colored_message="$timestamp $prefix $message" + fi + log_message="$timestamp $prefix $message" + # Display the message in the terminal echo -e "$colored_message" >&2