diff --git a/main.py b/main.py index 87cebe9..da5b0b0 100644 --- a/main.py +++ b/main.py @@ -14,6 +14,7 @@ import nest_asyncio from dotenv import load_dotenv from mcp.server.fastmcp import FastMCP +from pythonjsonlogger import jsonlogger from telethon import TelegramClient, functions, utils from telethon.sessions import StringSession from telethon.tl.types import ( @@ -78,12 +79,17 @@ def json_serializer(obj): file_handler = logging.FileHandler(log_file_path, mode="a") # Append mode file_handler.setLevel(logging.ERROR) - # Create formatter and add to handlers - formatter = logging.Formatter( - "%(asctime)s [%(levelname)s] %(name)s - %(message)s - %(filename)s:%(lineno)d" + # Create formatters + # Console formatter remains in the old format + console_formatter = logging.Formatter("%(asctime)s [%(levelname)s] %(name)s - %(message)s") + console_handler.setFormatter(console_formatter) + + # File formatter is now JSON + json_formatter = jsonlogger.JsonFormatter( + "%(asctime)s %(name)s %(levelname)s %(message)s", + datefmt="%Y-%m-%dT%H:%M:%S%z", ) - console_handler.setFormatter(formatter) - file_handler.setFormatter(formatter) + file_handler.setFormatter(json_formatter) # Add handlers to logger logger.addHandler(console_handler) @@ -140,17 +146,23 @@ def log_and_format_error( break prefix_str = prefix.value if prefix else "GEN" - error_code = f"{prefix_str}-ERR-{abs(hash(function_name)) % 1000:03d}" - # Format the additional context parameters - context = ", ".join(f"{k}={v}" for k, v in kwargs.items()) - - # Log the full technical error - logger.exception(f"{function_name} failed ({context}): {error}") + # Log the structured error + log_context = { + "function_name": function_name, + "error_code": error_code, + "error_message": str(error), + "parameters": kwargs, + } + logger.error( + f"Error in {function_name}", + extra=log_context, + exc_info=(type(error), error, error.__traceback__), + ) # Return a user-friendly message - return f"An error occurred (code: {error_code}). " f"Check mcp_errors.log for details." + return f"An error occurred (code: {error_code}). Check mcp_errors.log for details." def format_entity(entity) -> Dict[str, Any]: diff --git a/pyproject.toml b/pyproject.toml index 5e19ddc..6bfbcd9 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -29,6 +29,7 @@ dependencies = [ "mcp[cli]>=1.4.1", "nest-asyncio>=1.6.0", "python-dotenv>=1.1.0", + "python-json-logger>=3.3.0", "telethon>=1.39.0" ] diff --git a/requirements.txt b/requirements.txt index b9ab6bc..fca7260 100644 --- a/requirements.txt +++ b/requirements.txt @@ -3,4 +3,5 @@ httpx>=0.28.1 mcp[cli]>=1.4.1 nest-asyncio>=1.6.0 python-dotenv>=1.1.0 +python-json-logger>=3.3.0 telethon>=1.39.0 \ No newline at end of file