74 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
			
		
		
	
	
			74 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
| #!/usr/bin/env bash
 | |
| # We are not using `set -Eeuo pipefail` here because this file is sourced by
 | |
| # other scripts that might not be ready for a strict Bash setup. The functions
 | |
| # in this file do not require it, because they are not handling signals, have
 | |
| # no external calls that can fail (printf as well as date failures are ignored),
 | |
| # are not using any variables that need to be set, and are not using any pipes.
 | |
| 
 | |
| # This logger implementation can be replaced with another logger implementation
 | |
| # by placing a script called `logger.sh` in `/usr/local/bin` of the image. The
 | |
| # only requirement for the script is that it defines the following functions:
 | |
| #
 | |
| # - `log.debug`
 | |
| # - `log.notice`
 | |
| # - `log.warning`
 | |
| # - `log.error`
 | |
| # - `log.success`
 | |
| #
 | |
| # Each function **MUST** accept an arbitrary amount of arguments that make up
 | |
| # the (unstructured) logging message.
 | |
| #
 | |
| # Additionally the following environment variables **SHOULD** be supported to
 | |
| # disable their corresponding log entries, the value of the variables **MUST**
 | |
| # not matter the mere fact that they are set is all that matters:
 | |
| #
 | |
| # - `LOG_DEBUG_DISABLED`
 | |
| # - `LOG_NOTICE_DISABLED`
 | |
| # - `LOG_WARNING_DISABLED`
 | |
| # - `LOG_ERROR_DISABLED`
 | |
| # - `LOG_SUCCESS_DISABLED`
 | |
| 
 | |
| # The log format is constructed in a way that it can easily be parsed with
 | |
| # standard tools and simple string manipulations; pattern and example:
 | |
| #
 | |
| #     YYYY-MM-DD hh:mm:ss.SSS  $level --- $message
 | |
| #     2022-03-19 10:01:23.172  NOTICE --- example message
 | |
| #
 | |
| # This function is an implementation detail and **MUST NOT** be called from
 | |
| # outside this script (which is possible if the file is sourced).
 | |
| __log() {
 | |
|   local color instant level
 | |
| 
 | |
|   color=${1:?missing required <color> argument}
 | |
|   shift
 | |
| 
 | |
|   level=${FUNCNAME[1]} # `main` if called from top-level
 | |
|   level=${level#log.} # substring after `log.`
 | |
|   level=${level^^} # UPPERCASE
 | |
| 
 | |
|   if [[ ! -v "LOG_${level}_DISABLED" ]]; then
 | |
|     instant=$(date '+%F %T.%-3N' 2>/dev/null || :)
 | |
| 
 | |
|     # https://no-color.org/
 | |
|     if [[ -v NO_COLOR ]]; then
 | |
|       printf -- '%s  %s --- %s\n' "$instant" "$level" "$*" 1>&2 || :
 | |
|     else
 | |
|       printf -- '\033[0;%dm%s  %s --- %s\033[0m\n' "$color" "$instant" "$level" "$*" 1>&2 || :
 | |
|     fi
 | |
|   fi
 | |
| }
 | |
| 
 | |
| # To log with a dynamic level use standard Bash capabilities:
 | |
| #
 | |
| #     level=notice
 | |
| #     command || level=error
 | |
| #     "log.$level" message
 | |
| #
 | |
| # @formatter:off
 | |
| log.debug   () { __log 37 "$@"; } # white
 | |
| log.notice  () { __log 34 "$@"; } # blue
 | |
| log.warning () { __log 33 "$@"; } # yellow
 | |
| log.error   () { __log 31 "$@"; } # red
 | |
| log.success () { __log 32 "$@"; } # green
 | |
| # @formatter:on
 |