"""
Configures structured JSON logging for the MCP server.
"""
import json
import logging
import os
from datetime import datetime
class JSONFormatter(logging.Formatter):
"""Formats log records into a JSON format."""
def format(self, record):
log_object = {
"timestamp": datetime.utcnow().isoformat(),
"level": record.levelname,
"name": record.name,
"message": record.getMessage(),
"module": record.module,
"funcName": record.funcName,
"lineno": record.lineno,
}
if record.exc_info:
log_object["exc_info"] = self.formatException(record.exc_info)
return json.dumps(log_object)
def setup_logging():
"""
Sets up file-based structured JSON logging.
"""
log_dir = "logs"
if not os.path.exists(log_dir):
os.makedirs(log_dir)
log_file = os.path.join(log_dir, "mcp_server.log")
# Configure the root logger
root_logger = logging.getLogger()
root_logger.setLevel(logging.INFO)
# Remove existing handlers to prevent duplicate logs
if root_logger.hasHandlers():
root_logger.handlers.clear()
# Create a file handler for JSON logs
file_handler = logging.FileHandler(log_file)
file_handler.setFormatter(JSONFormatter())
root_logger.addHandler(file_handler)
# Also add a console handler for basic visibility during development
console_handler = logging.StreamHandler()
console_formatter = logging.Formatter(
"%(asctime)s - %(name)s - %(levelname)s - %(message)s"
)
console_handler.setFormatter(console_formatter)
root_logger.addHandler(console_handler)
logger = logging.getLogger(__name__)
logger.info("Structured JSON logging configured to write to %s", log_file)