# from https://blog.csdn.net/u011843342/article/details/131925837 import logging import sys from typing import Any, Dict from loguru import logger LOG_FORMAT = '{time:YYYY-MM-DD HH:mm:ss} [{level}] {module}:{name}:{line} - {message}' LOG_PATH = "./log" logger.add(f"{LOG_PATH}/info.log", filter=lambda record: "INFO" in record['level'].name, rotation="10 MB", retention="3 days", level="INFO", format=LOG_FORMAT) logger.add(f"{LOG_PATH}/debug.log", filter=lambda record: "DEBUG" in record['level'].name, rotation="10 MB", retention="3 days", level="DEBUG", format=LOG_FORMAT) logger.add(f"{LOG_PATH}/error.log", filter=lambda record: "ERROR" in record['level'].name, rotation="10 MB", retention="1 days", level="ERROR", format=LOG_FORMAT) S_LOGGING_CONFIG_DEFAULTS: Dict[str, Any] = dict( # no cov version=1, disable_existing_loggers=False, loggers={ "sanic.root": { "level": "INFO", "handlers": ["console"], "propagate": False }, "sanic.error": { "level": "INFO", "handlers": ["error_console"], "propagate": False, "qualname": "sanic.error", }, "sanic.access": { "level": "INFO", "handlers": ["access_console"], "propagate": False, "qualname": "sanic.access", }, "sanic.server": { "level": "INFO", "handlers": ["console"], "propagate": False, "qualname": "sanic.server", }, }, handlers={ "console": { "class": "utils.logger.InterceptHandler", }, "error_console": { "class": "utils.logger.InterceptHandler", }, "access_console": { "class": "utils.logger.InterceptHandler", }, } ) class InterceptHandler(logging.Handler): def emit(self, record: logging.LogRecord): try: level = logger.level(record.levelname).name except ValueError: level = record.levelno # Find caller from where originated the logged message frame, depth = logging.currentframe(), 2 while frame.f_code.co_filename == logging.__file__: # type: ignore frame = frame.f_back # type: ignore depth += 1 logger.opt(depth=depth, exception=record.exc_info).log(level, record.getMessage()) def setup_log(): logging.root.handlers = [InterceptHandler()] logging.root.setLevel("DEBUG") for name in logging.root.manager.loggerDict.keys(): logging.getLogger(name).handlers = [] logging.getLogger(name).propagate = True # logger.configure(handlers=[{"sink": sys.stdout, "serialize": False}])