Исходный код raito.utils.loggers
import logging
import shutil
from datetime import datetime, timezone
from typing import Literal, cast
from typing_extensions import override
__all__ = (
"ColoredFormatter",
"MuteLoggersFilter",
"core",
"log",
"middlewares",
"plugins",
"roles",
"scenes",
)
LEVEL = Literal["DEBUG", "INFO", "WARNING", "ERROR", "CRITICAL"]
WHITE = "\033[37m"
BRIGHT_BLACK = "\033[90m"
RESET = "\033[0m"
LEVEL_BACKGROUND_COLORS: dict[LEVEL, str] = {
"DEBUG": "\033[42m",
"INFO": "\033[104m",
"WARNING": "\033[103m",
"ERROR": "\033[101m",
"CRITICAL": "\033[41m",
}
LEVEL_FOREGROUND_COLORS: dict[LEVEL, str] = {
"DEBUG": "\033[32m",
"INFO": RESET,
"WARNING": RESET,
"ERROR": RESET,
"CRITICAL": "\033[31m",
}
[документация]
class ColoredFormatter(logging.Formatter):
@property
def terminal_width(self) -> int:
try:
return shutil.get_terminal_size().columns
except OSError:
return 80
[документация]
@override
def format(self, record: logging.LogRecord) -> str:
levelname = cast(LEVEL, record.levelname)
meta = self.get_meta(record)
message = self.get_message(record, levelname)
text = message if not meta else f"{meta} {message}"
if record.exc_info and not record.exc_text:
record.exc_text = self.formatException(record.exc_info)
if record.exc_text:
if not text.endswith("\n"):
text += "\n"
text += record.exc_text
if record.stack_info:
if not text.endswith("\n"):
text += "\n"
text += self.formatStack(record.stack_info)
return text
[документация]
def get_meta(self, record: logging.LogRecord) -> str:
dt = datetime.fromtimestamp(record.created, tz=timezone.utc).astimezone()
date = dt.strftime("%d.%m.%Y")
time = dt.strftime("%H:%M:%S")
now = date + " " + time
if self.terminal_width >= 140:
info = f"{BRIGHT_BLACK}{now}{RESET} {WHITE}{record.name}{RESET}"
tabs = " " * (64 - len(info))
return info + tabs
elif self.terminal_width >= 100:
return f"{BRIGHT_BLACK}{now}{RESET}"
elif self.terminal_width >= 70:
return f"{BRIGHT_BLACK}{time}{RESET}"
else:
return ""
[документация]
def get_message(self, record: logging.LogRecord, levelname: LEVEL) -> str:
background = LEVEL_BACKGROUND_COLORS.get(levelname, "")
tag = f"{background} {levelname[0]} {RESET}"
foreground = LEVEL_FOREGROUND_COLORS.get(levelname, "")
message = f"{foreground}{record.getMessage()}{RESET}"
return f"{tag} {message}"
[документация]
class MuteLoggersFilter(logging.Filter):
def __init__(self, *names: str) -> None:
self.names = set(names)
super().__init__()
[документация]
def filter(self, record: logging.LogRecord) -> bool:
return record.name not in self.names
core = logging.getLogger("raito.core")
routers = logging.getLogger("raito.core.routers")
commands = logging.getLogger("raito.core.commands")
middlewares = logging.getLogger("raito.middlewares")
plugins = logging.getLogger("raito.plugins")
roles = logging.getLogger("raito.plugins.roles")
scenes = logging.getLogger("raito.plugins.scenes")
utils = logging.getLogger("raito.utils")
storages = logging.getLogger("raito.utils.storages")
log = logging.getLogger()