lint/lib/functions/log.sh
Marco Ferrari 49001a2405
fix: respect log level when writing to the log (#5546)
- Write log messages in the log file according to the LOG_LEVEL that the
  user configured (or the default), instead of printing all the messages
  regardless of LOG_LEVEL to the log file.
- Don't emit colors if there is no terminal

Close #5337
2024-04-20 09:18:14 +00:00

194 lines
5.7 KiB
Bash
Executable file

#!/usr/bin/env bash
# GitHub Actions variables to enable workflow debug logging
# Ref: https://docs.github.com/en/actions/monitoring-and-troubleshooting-workflows/enabling-debug-logging
# Ref: https://github.com/actions/runner/pull/253
declare -l ACTIONS_RUNNER_DEBUG
ACTIONS_RUNNER_DEBUG="${ACTIONS_RUNNER_DEBUG:-"false"}"
declare -l ACTIONS_STEPS_DEBUG
ACTIONS_STEPS_DEBUG="${ACTIONS_STEPS_DEBUG:-"false"}"
declare -i RUNNER_DEBUG
RUNNER_DEBUG="${RUNNER_DEBUG:-0}"
# Default log file name (located in GITHUB_WORKSPACE folder)
LOG_FILE="${LOG_FILE:-"super-linter.log"}"
LOG_LEVEL="${LOG_LEVEL:-"INFO"}"
declare -l CREATE_LOG_FILE
CREATE_LOG_FILE="${CREATE_LOG_FILE:-"false"}"
export CREATE_LOG_FILE
if [[ ${ACTIONS_RUNNER_DEBUG} == true ]] ||
[[ ${ACTIONS_STEPS_DEBUG} == true ]] ||
[[ ${RUNNER_DEBUG} -eq 1 ]]; then
LOG_LEVEL="DEBUG"
echo "ACTIONS_RUNNER_DEBUG: ${ACTIONS_RUNNER_DEBUG}. ACTIONS_STEPS_DEBUG: ${ACTIONS_STEPS_DEBUG}. RUNNER_DEBUG: ${RUNNER_DEBUG}. Setting LOG_LEVEL to: ${LOG_LEVEL}"
fi
declare -l LOG_DEBUG
LOG_DEBUG="false"
declare -l LOG_VERBOSE
LOG_VERBOSE="false"
declare -l LOG_NOTICE
LOG_NOTICE="false"
declare -l LOG_WARN
LOG_WARN="false"
declare -l LOG_ERROR
LOG_ERROR="false"
if [[ ${LOG_LEVEL} == "DEBUG" || ${LOG_LEVEL} == "TRACE" ]]; then
LOG_DEBUG="true"
LOG_VERBOSE="true"
LOG_NOTICE="true"
LOG_WARN="true"
LOG_ERROR="true"
fi
if [[ ${LOG_LEVEL} == "INFO" || ${LOG_LEVEL} == "VERBOSE" ]]; then
LOG_VERBOSE="true"
LOG_NOTICE="true"
LOG_WARN="true"
LOG_ERROR="true"
fi
if [[ ${LOG_LEVEL} == "NOTICE" ]]; then
LOG_NOTICE="true"
LOG_WARN="true"
LOG_ERROR="true"
fi
if [[ ${LOG_LEVEL} == "WARN" ]]; then
LOG_WARN="true"
LOG_ERROR="true"
fi
if [[ ${LOG_LEVEL} == "ERROR" ]]; then
LOG_ERROR="true"
fi
export LOG_DEBUG
export LOG_VERBOSE
export LOG_NOTICE
export LOG_WARN
export LOG_ERROR
LOG_TEMP=$(mktemp) || echo "Failed to create temporary log file."
export LOG_TEMP
log() {
local EMIT_LOG_MESSAGE="${1}"
local MESSAGE="${2}"
local LOG_LEVEL_LABEL="${3}"
local LOG_MESSAGE_DATE
LOG_MESSAGE_DATE="$(date +"%F %T")"
local COLOR_MARKER
# Set foreground color to blue
COLOR_MARKER=$(echo -e "\e[0;34m")
# Reset colors
local NC
NC=$(echo -e "\e[0m")
if [ "${LOG_LEVEL_LABEL}" == "NOTICE" ]; then
# Set foreground color to green
COLOR_MARKER=$(echo -e "\e[0;32m")
elif [ "${LOG_LEVEL_LABEL}" == "WARN" ]; then
# Set foreground color to yellow
COLOR_MARKER=$(echo -e "\e[0;33m")
elif [ "${LOG_LEVEL_LABEL}" == "ERROR" ] || [ "${LOG_LEVEL_LABEL}" == "FATAL" ]; then
# Set foreground color to red
COLOR_MARKER=$(echo -e "\e[0;31m")
fi
LOG_LEVEL_LABEL="[${LOG_LEVEL_LABEL}]"
local COLORED_MESSAGE
COLORED_MESSAGE="${NC}${LOG_MESSAGE_DATE} ${COLOR_MARKER}${LOG_LEVEL_LABEL}${NC} ${MESSAGE}${NC}"
local MESSAGE_FOR_LOG_FILE
MESSAGE_FOR_LOG_FILE="${LOG_MESSAGE_DATE} ${LOG_LEVEL_LABEL} ${MESSAGE}"
if [[ "${EMIT_LOG_MESSAGE}" == "true" ]]; then
# Emit colors only if there's a terminal
if [ -t 0 ]; then
echo -e "${COLORED_MESSAGE}"
else
echo -e "${MESSAGE_FOR_LOG_FILE}"
fi
if [ "${CREATE_LOG_FILE}" = "true" ]; then
echo -e "${MESSAGE_FOR_LOG_FILE}" >>"${LOG_TEMP}"
fi
fi
}
debug() { log "${LOG_DEBUG}" "$*" "DEBUG"; }
info() { log "${LOG_VERBOSE}" "$*" "INFO"; }
notice() { log "${LOG_NOTICE}" "$*" "NOTICE"; }
warn() { log "${LOG_WARN}" "$*" "WARN"; }
error() { log "${LOG_ERROR}" "$*" "ERROR"; }
fatal() {
log "true" "$*" "FATAL"
exit 1
}
debug "LOG_LEVEL is set to: ${LOG_LEVEL}"
debug "Log level variables. LOG_DEBUG: ${LOG_DEBUG}, LOG_VERBOSE: ${LOG_VERBOSE}, LOG_NOTICE: ${LOG_NOTICE}. LOG_WARN: ${LOG_WARN}, LOG_ERROR: ${LOG_ERROR}"
# shellcheck disable=SC2034 # Variable is referenced in other files
SUPER_LINTER_INITIALIZATION_LOG_GROUP_TITLE="Super-Linter initialization"
export SUPER_LINTER_INITIALIZATION_LOG_GROUP_TITLE
GITHUB_ACTIONS_LOG_GROUP_MARKER_START="start"
export GITHUB_ACTIONS_LOG_GROUP_MARKER_START
GITHUB_ACTIONS_LOG_GROUP_MARKER_END="end"
export GITHUB_ACTIONS_LOG_GROUP_MARKER_END
writeGitHubActionsLogGroupMarker() {
local LOG_GROUP_MARKER_MODE="${1}"
shift
local GROUP_TITLE="${1}"
if [ -z "${GROUP_TITLE}" ]; then
fatal "GitHub Actions log group title variable is empty."
fi
if [ -z "${ENABLE_GITHUB_ACTIONS_GROUP_TITLE}" ]; then
fatal "GitHub Actions enable log group title variable is empty."
fi
if [[ "${LOG_GROUP_MARKER_MODE}" != "${GITHUB_ACTIONS_LOG_GROUP_MARKER_START}" ]] &&
[[ "${LOG_GROUP_MARKER_MODE}" != "${GITHUB_ACTIONS_LOG_GROUP_MARKER_END}" ]]; then
fatal "Unsupported LOG_GROUP_MARKER_MODE (${LOG_GROUP_MARKER_MODE}) for group: ${GROUP_TITLE}"
fi
if [[ "${ENABLE_GITHUB_ACTIONS_GROUP_TITLE}" == "true" ]]; then
if [[ "${LOG_GROUP_MARKER_MODE}" == "${GITHUB_ACTIONS_LOG_GROUP_MARKER_START}" ]]; then
echo "::group::${GROUP_TITLE}"
debug "Started GitHub Actions log group: ${GROUP_TITLE}"
elif [[ "${LOG_GROUP_MARKER_MODE}" == "${GITHUB_ACTIONS_LOG_GROUP_MARKER_END}" ]]; then
debug "Ending GitHub Actions log group: ${GROUP_TITLE}"
echo "::endgroup::"
fi
else
debug "Skipped GitHub Actions log group ${LOG_GROUP_MARKER_MODE} for group: ${GROUP_TITLE}"
fi
}
startGitHubActionsLogGroup() {
writeGitHubActionsLogGroupMarker "${GITHUB_ACTIONS_LOG_GROUP_MARKER_START}" "${1}"
}
endGitHubActionsLogGroup() {
writeGitHubActionsLogGroupMarker "${GITHUB_ACTIONS_LOG_GROUP_MARKER_END}" "${1}"
}
# We need these functions to be available when using parallel to run subprocesses
export -f debug
export -f endGitHubActionsLogGroup
export -f error
export -f fatal
export -f info
export -f log
export -f notice
export -f startGitHubActionsLogGroup
export -f warn
export -f writeGitHubActionsLogGroupMarker