From 593fade22e77b2433fdd93642e6191607534f0a2 Mon Sep 17 00:00:00 2001 From: ablogo Date: Fri, 16 Jan 2026 22:44:01 -0600 Subject: [PATCH] add log2mongo and remove custom logger --- README.md | 15 +++++-------- main.py | 4 ++-- requirements.txt | 1 - src/message_service.py | 4 ++-- src/mongo_logging.py | 51 ------------------------------------------ src/mongodb_service.py | 41 --------------------------------- src/user_service.py | 4 ++-- 7 files changed, 12 insertions(+), 108 deletions(-) delete mode 100644 src/mongo_logging.py delete mode 100644 src/mongodb_service.py diff --git a/README.md b/README.md index 4c14297..efd8b1c 100644 --- a/README.md +++ b/README.md @@ -1,17 +1,17 @@ # WebSocketServer -WebSocket server created for a chat application. +WebSocket server created this [chat application](https://github.com/ablogo/ChatService). This project must be used in conjunction with at least two others, one that is an authentication microservice that manage the users, and another microservice that manages chat functions. -It is necessary to develop a WebSocket client, or you can use the one found in the next repository. +It is necessary to develop a WebSocket client, or you can use the one found in [this repository](https://github.com/ablogo/WebSocketClient). -When connecting to the server, a token must be sent, which is obtained from the authentication microservice. +When connecting to the server, a token must be sent, which is obtained from this [authentication microservice](https://github.com/ablogo/AuthFastApi). All logs are sent to a MongoDB database. ## Requirements - Python 3.12+ -- MongoDB (local server or remote server) +- MongoDB database ## Installing 1. Create a virtual environment @@ -22,7 +22,7 @@ python -m venv .venv ```bash source .venv/bin/activate ``` - Activate it (Windows PowerShell) + - Activate it (Windows PowerShell) ```bash .venv\Scripts\Activate.ps1 ``` @@ -38,7 +38,4 @@ The address and port of the websocket server, the connection string of the datab ```bash python main.py ``` -6. Open the next url in a browser to see the Swagger UI -```bash -h -``` \ No newline at end of file +6. Use this [websocket client](https://github.com/ablogo/WebSocketClient) to connect and test the websocket server \ No newline at end of file diff --git a/main.py b/main.py index cdf2a38..a06e090 100644 --- a/main.py +++ b/main.py @@ -1,14 +1,14 @@ import os, http, json from websockets.sync.server import serve from dotenv import load_dotenv +from log2mongo import log2mongo from src.message_service import get_current_user, remove_connection, try_to_save_message, validate_message from src.user_service import verify_token, update_status, get_messages -from src.mongo_logging import MongoLogger users = dict() load_dotenv() -log = MongoLogger(os.environ["LOG_DB_URL"], os.environ["LOG_DATABASE_NAME"], "", os.environ["LOG_LEVEL"]) +log = log2mongo(os.environ["LOG_DB_URL"], os.environ["LOG_DATABASE_NAME"], level = os.environ["LOG_LEVEL"]) def handler(websocket): try: diff --git a/requirements.txt b/requirements.txt index 4bee936..b44cd2e 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,5 +1,4 @@ pip websockets requests -pymongo[srv] dotenv \ No newline at end of file diff --git a/src/message_service.py b/src/message_service.py index e2680e2..29fc79c 100644 --- a/src/message_service.py +++ b/src/message_service.py @@ -1,13 +1,13 @@ from datetime import datetime import os, json from dotenv import load_dotenv +from log2mongo import log2mongo from src.user_service import save_message from src.message_model import Message -from src.mongo_logging import MongoLogger load_dotenv() -log = MongoLogger(os.environ["LOG_DB_URL"], os.environ["LOG_DATABASE_NAME"], "", os.environ["LOG_LEVEL"]) +log = log2mongo(os.environ["LOG_DB_URL"], os.environ["LOG_DATABASE_NAME"], "", os.environ["LOG_LEVEL"]) def to_message(dct) -> Message | None: try: diff --git a/src/mongo_logging.py b/src/mongo_logging.py deleted file mode 100644 index 60a607c..0000000 --- a/src/mongo_logging.py +++ /dev/null @@ -1,51 +0,0 @@ -import logging, time - -from src.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(): - logger = logging.getLogger(f"{__name__}") - - def __init__(self, db_url: str, db_name: str, db_collection: str, level: int | str = 0): - 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/mongodb_service.py b/src/mongodb_service.py deleted file mode 100644 index 37f232c..0000000 --- a/src/mongodb_service.py +++ /dev/null @@ -1,41 +0,0 @@ -from pymongo import AsyncMongoClient -from pymongo import MongoClient -from pymongo.server_api import ServerApi -from pymongo.asynchronous.database import AsyncDatabase -from pymongo.database import Database - -class MongoAsyncService: - - def __init__(self, mongo_url: str, db_name: str) -> None: - try: - self.client = AsyncMongoClient(mongo_url, server_api= ServerApi(version='1', strict=True, deprecation_errors=True)) - self.database = self.client.get_database(db_name) - except Exception as e: - raise e - - def get_db(self) -> AsyncDatabase: - return self.database - - async def close_db(self): - try: - await self.client.close() - except Exception as e: - raise e - -class MongoService: - - def __init__(self, mongo_url: str, db_name: str) -> None: - try: - self.client = MongoClient(mongo_url, server_api= ServerApi(version='1', strict=True, deprecation_errors=True)) - self.database = self.client.get_database(db_name) - except Exception as e: - raise e - - def get_db(self) -> Database: - return self.database - - def close_db(self): - try: - self.client.close() - except Exception as e: - raise e \ No newline at end of file diff --git a/src/user_service.py b/src/user_service.py index b4f1888..209eeed 100644 --- a/src/user_service.py +++ b/src/user_service.py @@ -1,11 +1,11 @@ import os, requests, json +from log2mongo import log2mongo from dotenv import load_dotenv from src.message_model import Message -from src.mongo_logging import MongoLogger load_dotenv() -log = MongoLogger(os.environ["LOG_DB_URL"], os.environ["LOG_DATABASE_NAME"], "", os.environ["LOG_LEVEL"]) +log = log2mongo(os.environ["LOG_DB_URL"], os.environ["LOG_DATABASE_NAME"], "", os.environ["LOG_LEVEL"]) def verify_token(token: str): result = False