FILE / ScuroNeko/KuroCore

kurocore/logger.py

Исходный файл и его история в репозитории.
FILE c5e0c918283bf9055990cd05e86da0fe277a5e03
Files
KuroCore/kurocore/logger.py
T
2024-01-02 00:25:23 +03:00

114 lines
3.6 KiB
Python

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)