diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index f76e843..27ccad7 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -14,4 +14,4 @@ repos: hooks: - id: isort exclude: '^(env)' - args: ["profile", "--black"] + args: ["--profile", "black"] diff --git a/mr_robot/__main__.py b/mr_robot/__main__.py index 932ebd6..f3d9637 100644 --- a/mr_robot/__main__.py +++ b/mr_robot/__main__.py @@ -1,88 +1,18 @@ import asyncio -import atexit -import json import logging.config import logging.handlers import signal import sys from pathlib import Path -import coloredlogs import disnake import httpx -from dotenv import load_dotenv from sqlalchemy import event from sqlalchemy.engine import Engine from mr_robot.bot import MrRobot from mr_robot.constants import Client, Database - -load_dotenv() - - -def setup_logging_modern() -> None: - with open(Client.logging_config_file, "r") as file: - config = json.load(file) - logging.config.dictConfig(config) - queue_handler = logging.getHandlerByName("queue_handler") - if queue_handler is not None: - queue_handler.listener.start() # type: ignore[reportAttributeAccessIssue] - atexit.register(queue_handler.listener.stop) # type: ignore[reportAttributeAccessIssue] - - -def setup_logging() -> None: - root_logger = logging.getLogger() - - log_file = Path(Client.log_file_name) - log_file.parent.mkdir(exist_ok=True) - - formatter = "[ %(levelname)s | %(name)s | %(module)s | L%(lineno)d ] %(asctime)s: %(message)s" - file_formatter = logging.Formatter( - "[ %(levelname)s | %(name)s | %(module)s | %(funcName)s | %(filename)s | L%(lineno)d ] %(asctime)s: %(message)s" - ) - - file_handler = logging.handlers.RotatingFileHandler( - log_file, - mode="a", - # File handler rotates log every 5 MB - maxBytes=5 * (2**20), - backupCount=10, - ) - file_handler.setFormatter(file_formatter) - root_logger.addHandler(file_handler) - - # console_handler = logging.StreamHandler() - # console_handler.setFormatter(formatter) - # root_logger.addHandler(console_handler) - - file_handler.setLevel(logging.DEBUG) - # console_handler.setLevel(logging.INFO) - - coloredlogs.DEFAULT_LEVEL_STYLES = { - **coloredlogs.DEFAULT_LEVEL_STYLES, - "critical": {"color": "red"}, - "warning": {"color": "yellow"}, - "info": {"color": "green"}, - "debug": {"color": "white"}, - } - coloredlogs.install( - level=logging.DEBUG, stream=sys.stdout, logger=root_logger, fmt=formatter - ) - - root_logger.setLevel(logging.DEBUG) - logging.getLogger("httpx").setLevel(logging.WARNING) - logging.getLogger("mafic").setLevel(logging.WARNING) - logging.getLogger("httpcore").setLevel(logging.WARNING) - logging.getLogger("disnake").setLevel(logging.INFO) - logging.getLogger("sqlalchemy.engine").setLevel(logging.WARNING) - logging.getLogger("core").setLevel(logging.WARNING) - logging.getLogger("sqlalchemy.engine.Engine").setLevel(logging.WARNING) - logging.getLogger("sqlalchemy.pool").setLevel(logging.WARNING) - logging.getLogger("sqlalchemy.orm").setLevel(logging.WARNING) - logging.getLogger("aiosqlite").setLevel(logging.WARNING) - logging.getLogger("streamlink").disabled = True - - root_logger.info("Logger Initialized!") +from mr_robot.log import setup_logging @event.listens_for(Engine, "connect") diff --git a/mr_robot/log.py b/mr_robot/log.py new file mode 100644 index 0000000..e124fd3 --- /dev/null +++ b/mr_robot/log.py @@ -0,0 +1,82 @@ +import atexit +import json +import logging.config +import logging.handlers +from pathlib import Path + +import colorama + +from mr_robot.constants import Client + + +class LogFormatter(logging.Formatter): + colormap = { + logging.DEBUG: colorama.Fore.MAGENTA, + logging.INFO: colorama.Fore.BLUE, + logging.WARNING: colorama.Fore.YELLOW, + logging.ERROR: colorama.Fore.RED, + logging.CRITICAL: colorama.Fore.WHITE, + } + + def __init__(self, format: str) -> None: + super().__init__(format) + + def format(self, record: logging.LogRecord) -> str: + record.levelname = f"{self.colormap.get(record.levelno)}{record.levelname}{colorama.Fore.RESET}" + return super().format(record) + + +def setup_logging_modern() -> None: + with open(Client.logging_config_file, "r") as file: + config = json.load(file) + logging.config.dictConfig(config) + queue_handler = logging.getHandlerByName("queue_handler") + if queue_handler is not None: + queue_handler.listener.start() # type: ignore[reportAttributeAccessIssue] + atexit.register(queue_handler.listener.stop) # type: ignore[reportAttributeAccessIssue] + + +def setup_logging() -> None: + root_logger = logging.getLogger() + + log_file = Path(Client.log_file_name) + log_file.parent.mkdir(exist_ok=True) + + formatter = LogFormatter( + "[ %(levelname)s | %(name)s | %(module)s | L%(lineno)d ] %(asctime)s: %(message)s" + ) + file_formatter = logging.Formatter( + "[ %(levelname)s | %(name)s | %(module)s | %(funcName)s | %(filename)s | L%(lineno)d ] %(asctime)s: %(message)s" + ) + + file_handler = logging.handlers.RotatingFileHandler( + log_file, + mode="a", + # File handler rotates log every 5 MB + maxBytes=5 * (2**20), + backupCount=10, + ) + file_handler.setFormatter(file_formatter) + root_logger.addHandler(file_handler) + + console_handler = logging.StreamHandler() + console_handler.setFormatter(formatter) + root_logger.addHandler(console_handler) + + file_handler.setLevel(logging.DEBUG) + console_handler.setLevel(logging.INFO) + + root_logger.setLevel(logging.DEBUG) + logging.getLogger("httpx").setLevel(logging.WARNING) + logging.getLogger("mafic").setLevel(logging.WARNING) + logging.getLogger("httpcore").setLevel(logging.WARNING) + logging.getLogger("disnake").setLevel(logging.INFO) + logging.getLogger("sqlalchemy.engine").setLevel(logging.WARNING) + logging.getLogger("core").setLevel(logging.WARNING) + logging.getLogger("sqlalchemy.engine.Engine").setLevel(logging.WARNING) + logging.getLogger("sqlalchemy.pool").setLevel(logging.WARNING) + logging.getLogger("sqlalchemy.orm").setLevel(logging.WARNING) + logging.getLogger("aiosqlite").setLevel(logging.WARNING) + logging.getLogger("streamlink").disabled = True + + root_logger.info("Logger Initialized!") diff --git a/poetry.lock b/poetry.lock index 265153a..3ea38f7 100644 --- a/poetry.lock +++ b/poetry.lock @@ -493,23 +493,6 @@ files = [ {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, ] -[[package]] -name = "coloredlogs" -version = "15.0.1" -description = "Colored terminal output for Python's logging module" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -files = [ - {file = "coloredlogs-15.0.1-py2.py3-none-any.whl", hash = "sha256:612ee75c546f53e92e70049c9dbfcc18c935a2b9a53b66085ce9ef6a6e5c0934"}, - {file = "coloredlogs-15.0.1.tar.gz", hash = "sha256:7c991aa71a4577af2f82600d8f8f3a89f936baeaf9b50a9c197da014e5bf16b0"}, -] - -[package.dependencies] -humanfriendly = ">=9.1" - -[package.extras] -cron = ["capturer (>=2.4)"] - [[package]] name = "disnake" version = "2.9.2" @@ -1009,20 +992,6 @@ cli = ["click (==8.*)", "pygments (==2.*)", "rich (>=10,<14)"] http2 = ["h2 (>=3,<5)"] socks = ["socksio (==1.*)"] -[[package]] -name = "humanfriendly" -version = "10.0" -description = "Human friendly output for text interfaces using Python" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -files = [ - {file = "humanfriendly-10.0-py2.py3-none-any.whl", hash = "sha256:1697e1a8a8f550fd43c2865cd84542fc175a61dcb779b6fee18cf6b6ccba1477"}, - {file = "humanfriendly-10.0.tar.gz", hash = "sha256:6b0b831ce8f15f7300721aa49829fc4e83921a9a301cc7f606be6686a2288ddc"}, -] - -[package.dependencies] -pyreadline3 = {version = "*", markers = "sys_platform == \"win32\" and python_version >= \"3.8\""} - [[package]] name = "hyperframe" version = "6.0.1" @@ -1588,17 +1557,6 @@ files = [ [package.extras] diagrams = ["jinja2", "railroad-diagrams"] -[[package]] -name = "pyreadline3" -version = "3.4.1" -description = "A python implementation of GNU readline." -optional = false -python-versions = "*" -files = [ - {file = "pyreadline3-3.4.1-py3-none-any.whl", hash = "sha256:b0efb6516fd4fb07b45949053826a62fa4cb353db5be2bbb4a7aa1fdd1e345fb"}, - {file = "pyreadline3-3.4.1.tar.gz", hash = "sha256:6f3d1f7b8a31ba32b73917cefc1f28cc660562f39aea8646d30bd6eff21f7bae"}, -] - [[package]] name = "pytest" version = "8.2.0" @@ -1958,4 +1916,4 @@ multidict = ">=4.0" [metadata] lock-version = "2.0" python-versions = "^3.12" -content-hash = "a1f6b9fe96a18161d41f070455442abd51684759105387dc6656882089a47e05" +content-hash = "d55fb0116570c16446a61fe0348dfb7722adbf76c53a712d110fcbbd2f4ee40e" diff --git a/pyproject.toml b/pyproject.toml index 52c5809..4439f39 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -23,7 +23,7 @@ httpx = "^0.27.0" googletrans-py = "^4.0.0" mafic = "~2.10.0" sqlalchemy = "^2.0.31" -coloredlogs = "^15.0.1" +colorama = "^0.4.6" [tool.poetry.group.dev.dependencies] black = "^24.4.2"