refactor: update logger import paths to use rotoger

This commit is contained in:
grillazz
2026-03-09 18:05:05 +01:00
parent 07c98d79ae
commit 21c5953385
13 changed files with 21 additions and 108 deletions
+1 -1
View File
@@ -3,7 +3,7 @@ import time
import jwt
from fastapi import HTTPException, Request
from fastapi.security import HTTPAuthorizationCredentials, HTTPBearer
from app.services.logging import get_logger
from rotoger import get_logger
from app.config import settings as global_settings
from app.models.user import User
-86
View File
@@ -1,86 +0,0 @@
import logging
import os
from logging.handlers import RotatingFileHandler
from pathlib import Path
import orjson
import structlog
from whenever._whenever import Instant
# ---------------------------------------------------------------------------
# Constants / defaults
# ---------------------------------------------------------------------------
_DEFAULT_LOG_PATH = "."
_DEFAULT_MAX_BYTES = 10 * 1024 * 1024 # 10 MiB
_DEFAULT_BACKUP_COUNT = 5
# Generic registry: add any stdlib logger name + its desired level here.
_STDLIB_LOGGERS: dict[str, int] = {
"root": logging.INFO,
"uvicorn": logging.INFO,
"sqlalchemy": logging.WARNING,
}
# Shared processor chain used by both structlog and the stdlib formatter.
_SHARED_PROCESSORS: list[structlog.types.Processor] = [
structlog.contextvars.merge_contextvars,
structlog.stdlib.add_log_level,
structlog.stdlib.add_logger_name,
structlog.stdlib.PositionalArgumentsFormatter(),
structlog.processors.TimeStamper(fmt="iso", utc=True),
structlog.processors.format_exc_info,
]
def _build_handler() -> RotatingFileHandler:
log_dir = Path(os.getenv("ROTOGER_LOG_PATH", _DEFAULT_LOG_PATH))
log_dir.mkdir(parents=True, exist_ok=True)
log_path = log_dir / f"{Instant.now().py_datetime().strftime('%Y%m%d')}_{os.getpid()}.log"
handler = RotatingFileHandler(
filename=log_path,
maxBytes=int(os.getenv("ROTOGER_LOG_MAX_BYTES", _DEFAULT_MAX_BYTES)),
backupCount=int(os.getenv("ROTOGER_LOG_BACKUP_COUNT", _DEFAULT_BACKUP_COUNT)),
encoding="utf-8",
)
handler.setFormatter(
structlog.stdlib.ProcessorFormatter(
foreign_pre_chain=_SHARED_PROCESSORS,
processor=structlog.processors.JSONRenderer(
serializer=lambda *a, **kw: orjson.dumps(*a, **kw).decode()
),
)
)
return handler
def _configure_logger() -> structlog.BoundLogger:
"""Configure structlog + stdlib loggers and return a bound logger."""
structlog.configure(
processors=[
*_SHARED_PROCESSORS,
structlog.stdlib.ProcessorFormatter.wrap_for_formatter,
],
logger_factory=structlog.stdlib.LoggerFactory(),
wrapper_class=structlog.stdlib.BoundLogger,
cache_logger_on_first_use=True,
)
handler = _build_handler()
for name, level in _STDLIB_LOGGERS.items():
logger = logging.getLogger(name)
logger.addHandler(handler)
logger.propagate = False
logger.setLevel(level)
return structlog.get_logger()
# Module-level singleton
_logger_instance = _configure_logger()
def get_logger() -> structlog.BoundLogger:
"""Return the configured singleton logger instance."""
return _logger_instance
+1 -1
View File
@@ -3,7 +3,7 @@ from datetime import datetime
from apscheduler import AsyncScheduler
from apscheduler.triggers.interval import IntervalTrigger
from attrs import define
from app.services.logging import get_logger
from rotoger import get_logger
from sqlalchemy import text
from starlette.types import ASGIApp, Receive, Scope, Send
+1 -1
View File
@@ -5,7 +5,7 @@ from email.mime.text import MIMEText
from attrs import define, field
from fastapi.templating import Jinja2Templates
from pydantic import EmailStr
from app.services.logging import get_logger
from rotoger import get_logger
from app.config import settings as global_settings
from app.utils.singleton import SingletonMetaNoArgs