Files
KKAFIO/app/common/logger.py
2024-07-24 03:46:19 +01:00

137 lines
4.3 KiB
Python

import logging
import sys
from datetime import datetime
from typing import Union
from app.common.signal_bus import signalBus
class Logger:
"""
Logger class for logging
"""
def __init__(self):
"""
:param logger_signal: Logger Box signal
"""
# Init logger box signal, logs and logger
# logger box signal is used to output log to logger box
self.logs = ""
self.logger_signal = signalBus.loggerSignal
self.logger = logging.getLogger("BAAS_Logger")
formatter = logging.Formatter("%(levelname)8s |%(asctime)20s | %(message)s ")
handler1 = logging.StreamHandler(stream=sys.stdout)
handler1.setFormatter(formatter)
self.logger.setLevel(logging.INFO)
self.logger.addHandler(handler1)
def __out__(self, category: str, message: str, level: int = 1, raw_print=False) -> None:
"""
Output log
:param message: log message
:param level: log level
:return: None
"""
# If raw_print is True, output log to logger box
if raw_print:
self.logs += message
self.logger_signal.emit(message)
return
while len(logging.root.handlers) > 0:
logging.root.handlers.pop()
# Status Text: INFO, SUCCESS, ERROR, SKIPPED, REPLACED, RENAMED, REMOVED
status = ['    INFO', '  SUCCESS', '   ERROR',
' SKIPPED', ' REPLACED', ' RENAMED', ' REMOVED']
# Status Color: Blue, Red, Green, Orange,
statusColor = ['#2d8cf0', '#ed3f14', '#f90', '#f90', '#f90', '#f90', '#00c12b']
# Status HTML: <b style="color:$color">status</b>
statusHtml = [
f'<b style="color:{_color};">{status}</b>'
for _color, status in zip(statusColor, status)]
# If logger box is not None, output log to logger box
# else output log to console
if self.logger_signal is not None:
message = message.replace('\n', '<br>').replace(' ', '&nbsp;')
adding = (f'''
<div style="font-family: Consolas, monospace;color:{statusColor[level - 1]};">
{statusHtml[level - 1]} | {category} | {message}
</div>
''')
self.logs += adding
self.logger_signal.emit(adding)
else:
print(f'{statusHtml[level - 1]} | {datetime.now().strftime("%Y-%m-%d %H:%M:%S")} | {message}')
def info(self, category: str, message: str) -> None:
"""
:param message: log message
Output info log
"""
self.__out__(category, message, 1)
def success(self, category: str, message: Union[str, Exception]) -> None:
"""
:param message: log message
Output error log
"""
self.__out__(category, message, 2)
def error(self, category: str, message: Union[str, Exception]) -> None:
"""
:param message: log message
Output error log
"""
self.__out__(category, message, 3)
def skipped(self, category: str, message: str) -> None:
"""
:param message: log message
Output warn log
"""
self.__out__(category, message, 4)
def replaced(self, category: str, message: str) -> None:
"""
:param message: log message
Output warn log
"""
self.__out__(category, message, 5)
def renamed(self, category: str, message: str) -> None:
"""
:param message: log message
Output warn log
"""
self.__out__(category, message, 6)
def removed(self, category: str, message: str) -> None:
"""
:param message: log message
Output warn log
"""
self.__out__(category, message, 6)
def line(self) -> None:
"""
Output line
"""
# While the line print do not need wrapping, we
# use raw_print=True to output log to logger box
self.__out__(
'<div style="font-family: Consolas, monospace;color:#2d8cf0;">--------------'
'-------------------------------------------------------------'
'-------------------</div>', raw_print=True)
logger = Logger()