"""
Centralized Logging Configuration for MCP Server
All logs are stored in ~/Documents/pbdb/logs/
"""
import logging
import os
from datetime import datetime
from pathlib import Path
# Log directory - centralized in pbdb
LOG_DIR = os.path.join(os.path.expanduser('~'), 'Documents', 'pbdb', 'logs')
os.makedirs(LOG_DIR, exist_ok=True)
# Log file with date
LOG_FILE = os.path.join(LOG_DIR, f'mcp_server_{datetime.now().strftime("%Y%m%d")}.log')
# Create formatter
formatter = logging.Formatter(
'%(asctime)s | %(levelname)-8s | %(name)-20s | %(funcName)-25s | %(message)s',
datefmt='%Y-%m-%d %H:%M:%S'
)
# File handler
file_handler = logging.FileHandler(LOG_FILE, encoding='utf-8')
file_handler.setLevel(logging.DEBUG)
file_handler.setFormatter(formatter)
# Console handler (for debugging)
console_handler = logging.StreamHandler()
console_handler.setLevel(logging.WARNING)
console_handler.setFormatter(formatter)
def get_logger(name: str) -> logging.Logger:
"""Get a configured logger for a module"""
logger = logging.getLogger(name)
logger.setLevel(logging.DEBUG)
# Avoid adding handlers multiple times
if not logger.handlers:
logger.addHandler(file_handler)
logger.addHandler(console_handler)
return logger
def log_tool_call(logger: logging.Logger, tool_name: str, arguments: dict, result: dict):
"""Log a tool call with its arguments and result"""
success = result.get('success', False) if isinstance(result, dict) else False
if success:
logger.info(f"TOOL: {tool_name} | ARGS: {arguments} | STATUS: SUCCESS")
else:
error = result.get('error', 'Unknown error') if isinstance(result, dict) else str(result)
logger.error(f"TOOL: {tool_name} | ARGS: {arguments} | STATUS: FAILED | ERROR: {error}")
def log_exception(logger: logging.Logger, context: str, exception: Exception):
"""Log an exception with full traceback"""
import traceback
logger.error(f"EXCEPTION in {context}: {str(exception)}")
logger.debug(f"TRACEBACK:\n{traceback.format_exc()}")
# Create main server logger
server_logger = get_logger('mcp_server')
server_logger.info(f"=== MCP Server Logger Initialized === Log file: {LOG_FILE}")