OnlyBiggg
fix
459ccc5
raw
history blame
3.15 kB
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import inspect
import logging
import os
import sys
from asgi_correlation_id import correlation_id
from loguru import logger
from core import path_conf
from core.conf import settings
class InterceptHandler(logging.Handler):
def emit(self, record: logging.LogRecord):
try:
level = logger.level(record.levelname).name
except ValueError:
level = record.levelno
frame, depth = inspect.currentframe(), 0
while frame and (depth == 0 or 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())
def setup_logging() -> None:
"""
- https://github.com/benoitc/gunicorn/issues/1572#issuecomment-638391953
- https://github.com/pawamoy/pawamoy.github.io/issues/17
"""
logging.root.handlers = [InterceptHandler()]
logging.root.setLevel(settings.LOG_STD_LEVEL)
for name in logging.root.manager.loggerDict.keys():
logging.getLogger(name).handlers = []
if 'uvicorn.access' in name or 'watchfiles.main' in name:
logging.getLogger(name).setLevel(logging.INFO)
logging.getLogger(name).propagate = False
logging.getLogger(name).addHandler(InterceptHandler())
else:
logging.getLogger(name).propagate = True
# Debug log handlers
# logging.debug(f'{logging.getLogger(name)}, {logging.getLogger(name).propagate}')
# https://github.com/snok/asgi-correlation-id/issues/7
def correlation_id_filter(record):
cid = correlation_id.get(settings.LOG_CID_DEFAULT_VALUE)
record['correlation_id'] = cid[: settings.LOG_CID_UUID_LENGTH]
return record
logger.remove()
logger.configure(
handlers=[
{
'sink': sys.stdout,
'level': settings.LOG_STD_LEVEL,
'filter': lambda record: correlation_id_filter(record),
'format': settings.LOG_STD_FORMAT,
}
]
)
def set_custom_logfile() -> None:
log_path = path_conf.LOG_DIR
if not os.path.exists(log_path):
os.mkdir(log_path)
log_access_file = os.path.join(log_path, settings.LOG_ACCESS_FILENAME)
log_error_file = os.path.join(log_path, settings.LOG_ERROR_FILENAME)
# https://loguru.readthedocs.io/en/stable/api/logger.html#loguru._logger.Logger.add
log_config = {
'format': settings.LOG_FILE_FORMAT,
'enqueue': True,
'rotation': '5 MB',
'retention': '7 days',
'compression': 'tar.gz',
}
logger.add(
str(log_access_file),
level=settings.LOG_ACCESS_FILE_LEVEL,
filter=lambda record: record['level'].no <= 25,
backtrace=False,
diagnose=False,
**log_config,
)
logger.add(
str(log_error_file),
level=settings.LOG_ERROR_FILE_LEVEL,
filter=lambda record: record['level'].no >= 30,
backtrace=True,
diagnose=True,
**log_config,
)
log = logger