Spaces:
Sleeping
Sleeping
| # https://github.com/nonebot/nonebot2/blob/master/nonebot/log.py | |
| import logging | |
| import sys | |
| from typing import TYPE_CHECKING | |
| import loguru | |
| if TYPE_CHECKING: | |
| from loguru import Logger, Record | |
| logger: "Logger" = loguru.logger | |
| class LoguruHandler(logging.Handler): | |
| """logging 与 loguru 之间的桥梁,将 logging 的日志转发到 loguru。""" | |
| def emit(self, record: logging.LogRecord): | |
| try: | |
| level = logger.level(record.levelname).name | |
| except ValueError: | |
| level = record.levelno | |
| frame, depth = logging.currentframe(), 2 | |
| while frame and frame.f_code.co_filename == logging.__file__: | |
| frame = frame.f_back | |
| depth += 1 | |
| logger.opt(depth=depth, exception=record.exc_info).log( | |
| level, record.getMessage() | |
| ) | |
| # https://github.com/nonebot/nonebot2/blob/master/nonebot/drivers/fastapi.py#L182 | |
| LOGGING_CONFIG = { | |
| "version": 1, | |
| "disable_existing_loggers": False, | |
| "handlers": { | |
| "default": { | |
| "class": "meme_generator.log.LoguruHandler", | |
| }, | |
| }, | |
| "loggers": { | |
| "uvicorn.error": {"handlers": ["default"], "level": "INFO"}, | |
| "uvicorn.access": { | |
| "handlers": ["default"], | |
| "level": "INFO", | |
| }, | |
| }, | |
| } | |
| def setup_logger(): | |
| from .config import config_file_path, meme_config | |
| def default_filter(record: "Record"): | |
| """默认的日志过滤器,根据 `log_level` 配置改变日志等级。""" | |
| log_level = meme_config.log.log_level | |
| levelno = ( | |
| logger.level(log_level).no if isinstance(log_level, str) else log_level | |
| ) | |
| return record["level"].no >= levelno | |
| default_format: str = ( | |
| "<g>{time:MM-DD HH:mm:ss}</g> " | |
| "[<lvl>{level}</lvl>] " | |
| "<c><u>{name}</u></c> | " | |
| # "<c>{function}:{line}</c>| " | |
| "{message}" | |
| ) | |
| logger.remove() | |
| logger.add( | |
| sys.stdout, | |
| level=0, | |
| diagnose=False, | |
| filter=default_filter, | |
| format=default_format, | |
| ) | |
| logger.opt(colors=True).info( | |
| f"Config file path: <y><d>{config_file_path.resolve()}</d></y>" | |
| ) | |
| logger.opt(colors=True).debug( | |
| f"Loaded config: <y><d>{str(meme_config.dict())}</d></y>" | |
| ) | |