import logging
from pythonjsonlogger import jsonlogger
def init() -> None:
log_in_json()
map_levelname_to_status()
# Force all loggers to talk JSON rather than text so DataDog can parse the output.
def log_in_json() -> None:
loggers = [
logging.getLogger("uvicorn.access"),
logging.getLogger("uvicorn.error"),
logging.getLogger("uvicorn"),
logging.getLogger(),
]
for logger in loggers:
for handler in logger.handlers:
logger.removeHandler(handler)
logger.level = logging.DEBUG
log_handler = logging.StreamHandler()
formatter = jsonlogger.JsonFormatter(
"%(asctime)s %(levelname)s %(name)s %(message)s"
)
log_handler.setFormatter(formatter)
logger.addHandler(log_handler)
# DataDog is expecting 'status' for log level but the python default is 'levelname'.
def map_levelname_to_status() -> None:
old_factory = logging.getLogRecordFactory()
def record_factory(*args: str, **kwargs: str) -> logging.LogRecord:
record = old_factory(*args, **kwargs)
record.status = record.levelname # type: ignore
return record
logging.setLogRecordFactory(record_factory)