|
|
|
# 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}])
|