From 4dbc17f486bf01fe75d0653f2fba8001f42018df Mon Sep 17 00:00:00 2001 From: ablogo Date: Fri, 16 Jan 2026 12:08:28 -0600 Subject: [PATCH 1/2] Add package to send the logs to mongodb --- .env | 4 +-- src/dependency_injection/containers.py | 7 ++-- src/logging/mongo_logging.py | 50 -------------------------- src/middlewares/auth_jwt.py | 2 +- src/middlewares/auth_roles_jwt.py | 3 +- src/routers/admin/users_router.py | 4 +-- src/routers/auth_router.py | 4 +-- src/services/crypto_service.py | 5 ++- src/services/jwt_service.py | 4 +-- src/services/login_service.py | 4 +-- src/services/totp_service.py | 5 ++- src/services/user_service.py | 4 +-- 12 files changed, 22 insertions(+), 74 deletions(-) delete mode 100644 src/logging/mongo_logging.py diff --git a/.env b/.env index 2b32972..5769eb6 100644 --- a/.env +++ b/.env @@ -5,11 +5,11 @@ DB_USERS_PICTURES_COLLECTION=users.pictures DB_USERS_CONTACTS_COLLECTION=users.contacts DB_USERS_MESSAGES_COLLECTION=users.messages LOG_DB_URL= -LOG_DATABASE_NAME=auth-logs +LOG_DATABASE_NAME=auth-service-logs LOG_LEVEL=DEBUG JWT_SECRET_KEY= JWT_ALGORITHM=HS256 -JWT_EXPIRE_MINUTES=15 +JWT_EXPIRE_MINUTES=240 CORS_ALLOWED_HOSTS="http://localhost:8081,http://localhost:8002" TOTP_SECRET= TOTP_DIGEST=sha1 diff --git a/src/dependency_injection/containers.py b/src/dependency_injection/containers.py index 3d56f81..e997339 100644 --- a/src/dependency_injection/containers.py +++ b/src/dependency_injection/containers.py @@ -1,10 +1,10 @@ from dependency_injector import containers, providers import os from dotenv import load_dotenv +from log2mongo import log2mongo from src.services import mongodb_service from src.services.crypto_service import CryptoService -from src.logging.mongo_logging import MongoLogger from src.services.totp_service import TOTP load_dotenv() @@ -27,11 +27,10 @@ class Container(containers.DeclarativeContainer): #config = providers.Configuration(ini_files=["config.ini"]) logging = providers.Singleton( - MongoLogger, + log2mongo, os.environ["LOG_DB_URL"], #config.log.db_url, os.environ["LOG_DATABASE_NAME"], #config.log.db_database, - "", - os.environ["LOG_LEVEL"], #config.log.level + level = os.environ["LOG_LEVEL"], #config.log.level ) database_client = providers.Singleton( diff --git a/src/logging/mongo_logging.py b/src/logging/mongo_logging.py deleted file mode 100644 index 37ac672..0000000 --- a/src/logging/mongo_logging.py +++ /dev/null @@ -1,50 +0,0 @@ -import logging, time - -from src.services.mongodb_service import MongoService - -class MongoLoggerHandler(logging.Handler): - - def __init__(self, db_url: str, db_name: str, db_collection: str, collection_name_lower_case: bool = True, level: int | str = 0) -> None: - super().__init__(level) - self._mongo = MongoService(db_url, db_name) - self.db = self._mongo.database - self.db_collection = db_collection - self.collection_lower_case = collection_name_lower_case - - def emit(self, record): - try: - log_obj = { - "timestamp": time.gmtime(record.created), - "name": record.name, - "level": record.levelname, - "message": record.getMessage(), - "module": record.module, - "function": record.funcName, - "line": record.lineno, - "path": record.pathname - } - formatted_message = self.format(record) - db_collection = self.db_collection if self.db_collection != "" else record.levelname - db_collection = db_collection.lower() if self.collection_lower_case else db_collection - e = self.db[db_collection].insert_one(log_obj) - print(formatted_message) - except Exception as e: - print(f"Error printing custom log: { e }") - - def __del__(self) -> None: - self._mongo.close_db() - -class MongoLogger(): - - def __init__(self, db_url: str, db_name: str, db_collection: str, level: int | str = 0) -> None: - self.logger = logging.getLogger(f"{__name__}") - self.logger.handlers.clear() - self.logger.setLevel(level) - handler = MongoLoggerHandler(db_url, db_name, db_collection, level= level) - format = logging.Formatter("%(asctime)s - %(levelname)s - %(name)s - %(funcName)s - %(message)s") - handler.setFormatter(format) - self.logger.addHandler(handler) - #logging.basicConfig( - #level=logging.INFO, - #format="%(asctime)s - %(levelname)s - %(name)s - %(funcName)s - %(message)s" - #) \ No newline at end of file diff --git a/src/middlewares/auth_jwt.py b/src/middlewares/auth_jwt.py index bbd8af7..ff17500 100644 --- a/src/middlewares/auth_jwt.py +++ b/src/middlewares/auth_jwt.py @@ -16,4 +16,4 @@ async def __call__(self, request: Request): email = await verify_token(token) return email except Exception as e: - raise e \ No newline at end of file + raise e diff --git a/src/middlewares/auth_roles_jwt.py b/src/middlewares/auth_roles_jwt.py index f478dec..c8badb9 100644 --- a/src/middlewares/auth_roles_jwt.py +++ b/src/middlewares/auth_roles_jwt.py @@ -16,4 +16,5 @@ async def __call__(self, request: Request): email = await verify_token_and_roles(token, ['admin']) return email except Exception as e: - raise e \ No newline at end of file + raise e + \ No newline at end of file diff --git a/src/routers/admin/users_router.py b/src/routers/admin/users_router.py index cc02b83..b8738e1 100644 --- a/src/routers/admin/users_router.py +++ b/src/routers/admin/users_router.py @@ -1,6 +1,7 @@ from typing import Annotated from fastapi import APIRouter, Depends, Response from pymongo.asynchronous.database import AsyncDatabase +from log2mongo import log2mongo from dependency_injector.wiring import Provide, inject from src.models.user_model import User @@ -9,7 +10,6 @@ from src.dependencies import get_db from src.middlewares.auth_jwt import JWTCustom from src.dependency_injection.containers import Container -from src.logging.mongo_logging import MongoLogger import src.services.user_service as uSvc oauth2_scheme = JWTCustom(tokenUrl="/auth/sign-in") @@ -18,7 +18,7 @@ dependencies=[Depends(oauth2_scheme)], prefix="/admin") db_dependency = Annotated[AsyncDatabase, Depends(get_db)] -log_dependency = Annotated[MongoLogger, Depends(Provide[Container.logging])] +log_dependency = Annotated[log2mongo, Depends(Provide[Container.logging])] @router.get("/user", response_model=User) @inject diff --git a/src/routers/auth_router.py b/src/routers/auth_router.py index 4fd3565..6a584d9 100644 --- a/src/routers/auth_router.py +++ b/src/routers/auth_router.py @@ -3,13 +3,13 @@ from fastapi.security import OAuth2PasswordRequestForm from fastapi.responses import JSONResponse from dependency_injector.wiring import Provide, inject +from log2mongo import log2mongo from src.middlewares.auth_jwt import JWTCustom from src.models.sign_up_model import SignUp from src.models.user_model import User from src.services.mongodb_service import MongoAsyncService from src.dependency_injection.containers import Container -from src.logging.mongo_logging import MongoLogger from src.services.login_service import login from src.services.user_service import create_user @@ -19,7 +19,7 @@ ) oauth2_scheme = JWTCustom(tokenUrl="/auth/sign-in") db_dependency = Annotated[MongoAsyncService, Depends(Provide[Container.database_client])] -log_dependency = Annotated[MongoLogger, Depends(Provide[Container.logging])] +log_dependency = Annotated[log2mongo, Depends(Provide[Container.logging])] @router.post("/sign-up") @inject diff --git a/src/services/crypto_service.py b/src/services/crypto_service.py index 8fc5675..c861807 100644 --- a/src/services/crypto_service.py +++ b/src/services/crypto_service.py @@ -4,13 +4,12 @@ from cryptography.hazmat.backends import default_backend from cryptography.hazmat.primitives.asymmetric import padding import base64 - -from src.logging.mongo_logging import MongoLogger +from log2mongo import log2mongo class CryptoService: #@inject - def __init__(self, log: MongoLogger) -> None: + def __init__(self, log: log2mongo) -> None: self.private_key = self.get_private_key() self.public_key = self.get_public_key() self.pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto") diff --git a/src/services/jwt_service.py b/src/services/jwt_service.py index 9121da3..62b0757 100644 --- a/src/services/jwt_service.py +++ b/src/services/jwt_service.py @@ -2,15 +2,15 @@ from typing import Optional from dependency_injector.wiring import Provide, inject from fastapi import HTTPException, Request +from log2mongo import log2mongo from dotenv import load_dotenv import os, jwt from src.services.crypto_service import CryptoService -from src.logging.mongo_logging import MongoLogger from src.dependency_injection.containers import Container crypto_service: CryptoService = Provide[Container.crypto_service] -log_service: MongoLogger = Provide[Container.logging] +log_service: log2mongo = Provide[Container.logging] load_dotenv() @inject diff --git a/src/services/login_service.py b/src/services/login_service.py index b5d140a..6fc9661 100644 --- a/src/services/login_service.py +++ b/src/services/login_service.py @@ -1,14 +1,14 @@ from dependency_injector.wiring import Provide, inject +from log2mongo import log2mongo from src.services.user_service import get_user from src.services.jwt_service import create_token from src.models.token_model import Token from src.services.crypto_service import CryptoService -from src.logging.mongo_logging import MongoLogger from src.dependency_injection.containers import Container crypto_service: CryptoService = Provide[Container.crypto_service] -logger: MongoLogger = Provide[Container.logging] +logger: log2mongo = Provide[Container.logging] @inject async def login(username: str, password: str, db, crypto = crypto_service, log = logger): diff --git a/src/services/totp_service.py b/src/services/totp_service.py index de868e0..3eda6b6 100644 --- a/src/services/totp_service.py +++ b/src/services/totp_service.py @@ -2,12 +2,11 @@ from typing import Optional, Union from src.services.otp_service import OTP import time - -from src.logging.mongo_logging import MongoLogger +from log2mongo import log2mongo class TOTP(OTP): - def __init__(self, secret: str, digest: str, time_step: int, return_digits: int, log: MongoLogger) -> None: + def __init__(self, secret: str, digest: str, time_step: int, return_digits: int, log: log2mongo) -> None: self.secret = secret self.digest = digest self.time_step = time_step diff --git a/src/services/user_service.py b/src/services/user_service.py index 280e92c..5ed01a2 100644 --- a/src/services/user_service.py +++ b/src/services/user_service.py @@ -2,6 +2,7 @@ from fastapi import UploadFile from pymongo.asynchronous.database import AsyncDatabase from bson import ObjectId, Binary +from log2mongo import log2mongo from dotenv import load_dotenv import os @@ -10,11 +11,10 @@ from src.models.user_picture import UserPicture from src.models.user_model import User from src.models.address_model import Address -from src.logging.mongo_logging import MongoLogger from src.dependency_injection.containers import Container crypto_service: CryptoService = Provide[Container.crypto_service] -log_service: MongoLogger = Provide[Container.logging] +log_service: log2mongo = Provide[Container.logging] load_dotenv() users_collection = str(os.environ["DB_USERS_COLLECTION"]) users_pics_collection = str(os.environ["DB_USERS_PICTURES_COLLECTION"]) From 1a9920c86c2446820a751045778840aa389f0a13 Mon Sep 17 00:00:00 2001 From: ablogo Date: Fri, 16 Jan 2026 12:41:22 -0600 Subject: [PATCH 2/2] Update requirements file --- requirements.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/requirements.txt b/requirements.txt index 68bd84a..ea18575 100644 --- a/requirements.txt +++ b/requirements.txt @@ -2,6 +2,7 @@ pip fastapi uvicorn[standard] pymongo[srv] +log2mongo python-dotenv python-multipart pyjwt