You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
160 lines
3.7 KiB
160 lines
3.7 KiB
import logging
|
|
|
|
from termcolor import colored
|
|
|
|
|
|
class ColoredFormatter(logging.Formatter):
|
|
"""
|
|
A custom formatter for logging that adds colors to log messages.
|
|
|
|
This formatter adds colors to log messages based on their level,
|
|
making it easier to distinguish between different types of logs.
|
|
|
|
Attributes:
|
|
COLORS: A dictionary mapping log levels to colors.
|
|
"""
|
|
|
|
COLORS = {
|
|
"DEBUG": "cyan",
|
|
"INFO": "green",
|
|
"WARNING": "yellow",
|
|
"ERROR": "red",
|
|
"CRITICAL": "magenta",
|
|
}
|
|
|
|
def format(self, record):
|
|
"""
|
|
Format a log record with colors.
|
|
|
|
Args:
|
|
record: The log record to format.
|
|
|
|
Returns:
|
|
The formatted log message with colors.
|
|
"""
|
|
# all line in log will be colored
|
|
log_message = super().format(record)
|
|
return colored(log_message, self.COLORS.get(record.levelname, "white"))
|
|
|
|
# only log level will be colored
|
|
# levelname_colored = colored(record.levelname, self.COLORS.get(record.levelname, 'white'))
|
|
# record.levelname = levelname_colored
|
|
# return super().format(record)
|
|
|
|
# only keywords will be colored
|
|
# message = record.msg
|
|
# for word, color in self.KEYWORDS.items():
|
|
# if word in message:
|
|
# message = message.replace(word, colored(word, color))
|
|
# record.msg = message
|
|
# return super().format(record)
|
|
|
|
|
|
# config log
|
|
dev_logger = logging.getLogger("dev")
|
|
dev_formatter = ColoredFormatter("%(asctime)s - %(levelname)s - %(message)s")
|
|
dev_handler = logging.StreamHandler()
|
|
dev_handler.setFormatter(dev_formatter)
|
|
dev_logger.addHandler(dev_handler)
|
|
dev_logger.setLevel(logging.INFO)
|
|
|
|
progress_logger = logging.getLogger("progress")
|
|
progress_handler = logging.StreamHandler()
|
|
progress_handler.setFormatter(ColoredFormatter("%(message)s"))
|
|
progress_logger.addHandler(progress_handler)
|
|
progress_logger.setLevel(logging.INFO)
|
|
|
|
dev_mode = False
|
|
|
|
|
|
def set_dev_mode(mode: bool):
|
|
"""
|
|
Set the development mode.
|
|
|
|
When in development mode, debug, info, and warning logs are displayed.
|
|
When not in development mode, only error and critical logs are displayed.
|
|
|
|
Args:
|
|
mode: True to enable development mode, False to disable it.
|
|
"""
|
|
global dev_mode
|
|
dev_mode = mode
|
|
|
|
|
|
def set_level(level):
|
|
"""
|
|
Set the logging level for the development logger.
|
|
|
|
Args:
|
|
level: The logging level to set (e.g., logging.DEBUG, logging.INFO).
|
|
"""
|
|
dev_logger.setLevel(level)
|
|
|
|
|
|
def debug(message):
|
|
"""
|
|
Log a debug message.
|
|
|
|
Args:
|
|
message: The message to log.
|
|
"""
|
|
if dev_mode:
|
|
dev_logger.debug(message)
|
|
|
|
|
|
def info(message):
|
|
"""
|
|
Log an info message.
|
|
|
|
Args:
|
|
message: The message to log.
|
|
"""
|
|
if dev_mode:
|
|
dev_logger.info(message)
|
|
|
|
|
|
def warning(message):
|
|
"""
|
|
Log a warning message.
|
|
|
|
Args:
|
|
message: The message to log.
|
|
"""
|
|
if dev_mode:
|
|
dev_logger.warning(message)
|
|
|
|
|
|
def error(message):
|
|
"""
|
|
Log an error message.
|
|
|
|
Args:
|
|
message: The message to log.
|
|
"""
|
|
if dev_mode:
|
|
dev_logger.error(message)
|
|
|
|
|
|
def critical(message):
|
|
"""
|
|
Log a critical message and raise a RuntimeError.
|
|
|
|
Args:
|
|
message: The message to log.
|
|
|
|
Raises:
|
|
RuntimeError: Always raised with the provided message.
|
|
"""
|
|
dev_logger.critical(message)
|
|
raise RuntimeError(message)
|
|
|
|
|
|
def color_print(message, **kwargs):
|
|
"""
|
|
Print a colored message to the progress logger.
|
|
|
|
Args:
|
|
message: The message to print.
|
|
**kwargs: Additional keyword arguments to pass to the logger.
|
|
"""
|
|
progress_logger.info(message)
|
|
|