breadtube-bot/breadtube_bot/logger.py
2025-10-04 16:51:08 +09:00

60 lines
2.2 KiB
Python

from logging import handlers
import logging
from pathlib import Path
import sys
class ConsoleColor:
"""Simple shortcut to use colors in console"""
HEADER = '\033[95m'
BLUE = '\033[94m'
GREEN = '\033[92m'
ORANGE = '\033[93m'
RED = '\033[91m'
ENDCOLOR = '\033[0m'
BOLD = '\033[1m'
UNDERLINE = '\033[4m'
class ColoredFormatter(logging.Formatter):
"""Formatter changing the record during format : adds colors to levelname"""
def format(self, record):
levelno = record.levelno
if levelno == logging.ERROR:
levelname_color = ConsoleColor.RED + record.levelname + ConsoleColor.ENDCOLOR
elif levelno == logging.WARNING:
levelname_color = ConsoleColor.ORANGE + record.levelname + ConsoleColor.ENDCOLOR
elif levelno == logging.INFO:
levelname_color = ConsoleColor.GREEN + record.levelname + ConsoleColor.ENDCOLOR
elif levelno == logging.DEBUG:
levelname_color = ConsoleColor.BLUE + record.levelname + ConsoleColor.ENDCOLOR
else:
levelname_color = record.levelname
record.levelname = levelname_color
return logging.Formatter.format(self, record)
def create_logger(name: str, level: int, log_dir: Path | None = None, stdout=False) -> logging.Logger:
logger = logging.getLogger(name)
logger.setLevel(level)
if log_dir is not None:
log_dir.mkdir(parents=True, exist_ok=True)
logger.setLevel(level)
file_log_handler = handlers.RotatingFileHandler(
log_dir / f'{name}.log',
maxBytes=500000,
backupCount=5)
file_log_handler.setLevel(level)
log_formatter = logging.Formatter('%(asctime)s %(levelname)s : %(message)s')
file_log_handler.setFormatter(log_formatter)
logger.addHandler(file_log_handler)
if stdout:
terminal_log_handler = logging.StreamHandler(sys.stdout)
terminal_log_handler.setLevel(level)
colored_log_formatter = ColoredFormatter('%(asctime)s %(levelname)s : %(message)s')
terminal_log_handler.setFormatter(colored_log_formatter)
logger.addHandler(terminal_log_handler)
return logger