logger.py
 1  import logging
 2  import sys
 3  
 4  import sentry_sdk
 5  from fastapi import FastAPI
 6  from sentry_sdk.integrations.aiohttp import AioHttpIntegration
 7  from sentry_sdk.integrations.logging import LoggingIntegration, ignore_logger
 8  from sentry_sdk.integrations.sqlalchemy import SqlalchemyIntegration
 9  from uvicorn.config import LOGGING_CONFIG
10  from uvicorn.logging import DefaultFormatter
11  
12  from .settings import settings
13  
14  
15  def setup_sentry(app: FastAPI, dsn: str, name: str, version: str) -> None:
16      """Initialize sentry connection."""
17  
18      sentry_sdk.init(
19          dsn=dsn,
20          attach_stacktrace=True,
21          shutdown_timeout=5,
22          integrations=[
23              AioHttpIntegration(),
24              SqlalchemyIntegration(),
25              LoggingIntegration(level=logging.DEBUG, event_level=logging.WARNING),
26          ],
27          release=f"{name}@{version}",
28      )
29      ignore_logger("uvicorn.error")
30  
31  
32  logging_formatter = DefaultFormatter(fmt := "[%(asctime)s] %(levelprefix)s %(message)s")
33  LOGGING_CONFIG["formatters"]["default"]["fmt"] = fmt
34  LOGGING_CONFIG["formatters"]["access"][
35      "fmt"
36  ] = '[%(asctime)s] %(levelprefix)s %(client_addr)s - "%(request_line)s" %(status_code)s'
37  
38  logging_handler = logging.StreamHandler(sys.stdout)
39  logging_handler.setFormatter(logging_formatter)
40  
41  
42  def get_logger(name: str) -> logging.Logger:
43      """Get a logger with a given name."""
44  
45      logger: logging.Logger = logging.getLogger(name)
46      logger.addHandler(logging_handler)
47      logger.setLevel(settings.log_level)
48  
49      return logger