144 lines
5.2 KiB
Python
144 lines
5.2 KiB
Python
"""
|
|
Utility classes and functions
|
|
Copyright (C) 2023 Benjamin Burkhardt
|
|
|
|
This program is free software: you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation, either version 3 of the License, or
|
|
(at your option) any later version.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
"""
|
|
|
|
|
|
# Logger class that has 7 log levels: trace/all (6), debug (5), info(4), warning (3), error (2), fatal (1), off (0)
|
|
# log "level" -1 is always printed out ("On")
|
|
|
|
LOG_LVL_FALLBACK = 4 # the default level for logging
|
|
|
|
class Logger:
|
|
def __init__(self, log_level=LOG_LVL_FALLBACK):
|
|
self.mappings = { # mappings for the color and syntax of the log
|
|
-1: {
|
|
"prefix": "",
|
|
"space_between": "",
|
|
"prefix_colors": ShellColors.F_Default + ShellColors.B_Default,
|
|
"text_colors": ShellColors.F_Default + ShellColors.B_Default,
|
|
},
|
|
1: {
|
|
"prefix": "[FATAL]",
|
|
"space_between": " ",
|
|
"prefix_colors": ShellColors.F_White + ShellColors.B_Red,
|
|
"text_colors": ShellColors.B_Red + ShellColors.F_White,
|
|
},
|
|
2: {
|
|
"prefix": "[ERROR]",
|
|
"space_between": " ",
|
|
"prefix_colors": ShellColors.F_White + ShellColors.B_Red,
|
|
"text_colors": ShellColors.B_Red + ShellColors.F_White,
|
|
},
|
|
3: {
|
|
"prefix": "[WARN]",
|
|
"space_between": " ",
|
|
"prefix_colors": ShellColors.F_LightRed + ShellColors.B_Default,
|
|
"text_colors": ShellColors.F_Default + ShellColors.B_Default,
|
|
},
|
|
4: {
|
|
"prefix": "[INFO]",
|
|
"space_between": " ",
|
|
"prefix_colors": ShellColors.F_Green + ShellColors.B_Default,
|
|
"text_colors": ShellColors.F_Default + ShellColors.B_Default,
|
|
},
|
|
5: {
|
|
"prefix": "[DEBUG]",
|
|
"space_between": " ",
|
|
"prefix_colors": ShellColors.F_LightGray + ShellColors.B_Default,
|
|
"text_colors": ShellColors.F_Default + ShellColors.B_Default,
|
|
},
|
|
6: {
|
|
"prefix": "[TRACE]",
|
|
"space_between": " ",
|
|
"prefix_colors": ShellColors.F_Default + ShellColors.B_Default,
|
|
"text_colors": ShellColors.F_Default + ShellColors.B_Default,
|
|
},
|
|
}
|
|
|
|
if -1 <= log_level <= 6:
|
|
self.log_level = log_level
|
|
else: # if the given level exeeds the allowed scope
|
|
self.log_level = LOG_LVL_FALLBACK
|
|
self.log(f"The log level exeeds the allowed scope. Defaulting to {LOG_LVL_FALLBACK}", 3)
|
|
|
|
def log(self, message, log_level=4):
|
|
if log_level <= self.log_level: # only log when supposed to (if the given lvl is lower/equal (than) the maximum wanted)
|
|
prefix_colors = self.mappings[log_level]['prefix_colors']
|
|
prefix = self.mappings[log_level]['prefix']
|
|
space_between = self.mappings[log_level]['space_between']
|
|
text_colors = self.mappings[log_level]['text_colors']
|
|
end_color = ShellColors.Reset
|
|
print(f"{prefix_colors}{prefix}{text_colors}{space_between}{message}{end_color}")
|
|
|
|
|
|
# just for prettier shell outputs (especially log)
|
|
# source: https://stackoverflow.com/questions/39473297/how-do-i-print-colored-output-with-python-3
|
|
class ShellColors:
|
|
# Foreground
|
|
F_Default = "\x1b[39m"
|
|
F_Black = "\x1b[30m"
|
|
F_Red = "\x1b[31m"
|
|
F_Green = "\x1b[32m"
|
|
F_Yellow = "\x1b[33m"
|
|
F_Blue = "\x1b[34m"
|
|
F_Magenta = "\x1b[35m"
|
|
F_Cyan = "\x1b[36m"
|
|
F_LightGray = "\x1b[37m"
|
|
F_DarkGray = "\x1b[90m"
|
|
F_LightRed = "\x1b[91m"
|
|
F_LightGreen = "\x1b[92m"
|
|
F_LightYellow = "\x1b[93m"
|
|
F_LightBlue = "\x1b[94m"
|
|
F_LightMagenta = "\x1b[95m"
|
|
F_LightCyan = "\x1b[96m"
|
|
F_White = "\x1b[97m"
|
|
# Background
|
|
B_Default = "\x1b[49m"
|
|
B_Black = "\x1b[40m"
|
|
B_Red = "\x1b[41m"
|
|
B_Green = "\x1b[42m"
|
|
B_Yellow = "\x1b[43m"
|
|
B_Blue = "\x1b[44m"
|
|
B_Magenta = "\x1b[45m"
|
|
B_Cyan = "\x1b[46m"
|
|
B_LightGray = "\x1b[47m"
|
|
B_DarkGray = "\x1b[100m"
|
|
B_LightRed = "\x1b[101m"
|
|
B_LightGreen = "\x1b[102m"
|
|
B_LightYellow = "\x1b[103m"
|
|
B_LightBlue = "\x1b[104m"
|
|
B_LightMagenta = "\x1b[105m"
|
|
B_LightCyan = "\x1b[106m"
|
|
B_White = "\x1b[107m"
|
|
# Formatting
|
|
Bold = "\x1b[1m"
|
|
Dim = "\x1b[2m"
|
|
Italic = "\x1b[3m"
|
|
Underlined = "\x1b[4m"
|
|
Blink = "\x1b[5m"
|
|
Reverse = "\x1b[7m"
|
|
Hidden = "\x1b[8m"
|
|
# Reset part
|
|
Reset = "\x1b[0m"
|
|
Reset_Bold = "\x1b[21m"
|
|
Reset_Dim = "\x1b[22m"
|
|
Reset_Italic = "\x1b[23m"
|
|
Reset_Underlined = "\x1b[24"
|
|
Reset_Blink = "\x1b[25m"
|
|
Reset_Reverse = "\x1b[27m"
|
|
Reset_Hidden = "\x1b[28m"
|