KuroCore/kurocore/logger.py

114 lines
3.6 KiB
Python
Raw Normal View History

2024-01-02 00:25:23 +03:00
from logging import Formatter, StreamHandler, Logger, DEBUG, INFO, WARNING, ERROR
from logging.handlers import TimedRotatingFileHandler
from os import makedirs
from os.path import dirname
from aiohttp import ClientSession, TraceRequestStartParams, FormData
from multidict import CIMultiDict
from .config import Config
def mkdir_p(path):
try:
makedirs(dirname(path), exist_ok=True)
except TypeError:
makedirs(dirname(path))
class BotLogger:
log: Logger
def __init__(self, config: Config):
formatter = Formatter(
"[%(name)s] [%(levelname)s] [%(asctime)s] [%(filename)s:%(lineno)d]: %(message)s",
"%H:%M:%S %d.%m.%Y",
)
mkdir_p(config.logs.path)
level = DEBUG if config.debug else INFO
BotLogger.log = Logger(config.logs.name or "KuroCore", level=level)
console_handler = StreamHandler()
console_handler.setFormatter(formatter)
file_handler = TimedRotatingFileHandler(
"logs/log.log", when="midnight", encoding="utf-8"
)
file_handler.suffix = "%d.%m.%Y.log"
file_handler.setFormatter(formatter)
BotLogger.log.addHandler(console_handler)
BotLogger.log.addHandler(file_handler)
BotLogger.log.info("Logger initialized")
class RequestLogger:
log: Logger
def __init__(self, config: Config) -> None:
formatter = Formatter(
'[%(name)s] [REQUEST] [%(asctime)s]: %(message)s', "%H:%M:%S %d.%m.%Y"
)
mkdir_p(config.logs.path)
RequestLogger.log = Logger(config.logs.name, level=DEBUG)
console_handler = StreamHandler()
console_handler.setFormatter(formatter)
file_handler = TimedRotatingFileHandler(f'{config.logs.path}/requests.log', 'midnight')
file_handler.suffix = "%d.%m.%Y.log"
file_handler.setFormatter(formatter)
if config.logs.console:
RequestLogger.log.addHandler(console_handler)
RequestLogger.log.addHandler(file_handler)
RequestLogger.log.info("Request logger initialized")
class ClientLogger:
log: Logger
def __init__(self, config: Config):
formatter = Formatter(
"[%(name)s] [CLIENT] [%(asctime)s]: %(message)s",
"%H:%M:%S %d.%m.%Y",
)
mkdir_p(config.logs.path)
ClientLogger.log = Logger(config.logs.name, level=DEBUG)
console_handler = StreamHandler()
console_handler.setFormatter(formatter)
file_handler = TimedRotatingFileHandler("logs/client.log", when="midnight", encoding="utf-8")
file_handler.suffix = "%d.%m.%Y.log"
file_handler.setFormatter(formatter)
if config.logs.console:
ClientLogger.log.addHandler(console_handler)
ClientLogger.log.addHandler(file_handler)
ClientLogger.log.info("Client logger initialized")
@staticmethod
def format_header(headers: CIMultiDict):
out = []
for k, v in headers.items():
out.append(f'{k}:{v}')
return f'<{", ".join(out)}>'
@staticmethod
async def on_request_start(session: ClientSession, context, params: TraceRequestStartParams):
formatted_headers = ClientLogger.format_header(params.headers)
ClientLogger.log.debug(f'request {params.method} {params.url} headers={formatted_headers}')
class LoggingClientSession(ClientSession):
async def _request(self, method, url, **kwargs):
ClientLogger.log.debug(f'request <{method}> "{url}"')
ClientLogger.log.debug(f' body: {kwargs}')
return await super()._request(method, url, **kwargs)