diff --git a/kubectl_mcp_tool/mcp_server.py b/kubectl_mcp_tool/mcp_server.py index 69c2f69..80e1683 100644 --- a/kubectl_mcp_tool/mcp_server.py +++ b/kubectl_mcp_tool/mcp_server.py @@ -11,6 +11,9 @@ from typing import Dict, Any, List, Optional, Callable, Awaitable import warnings + +from kubectl_mcp_tool.utils.logging_util import set_logger_with_envs + warnings.filterwarnings( "ignore", category=RuntimeWarning, @@ -36,8 +39,8 @@ from .natural_language import process_query # Configure logging -logging.basicConfig(level=logging.DEBUG, format="%(asctime)s - %(name)s - %(levelname)s - %(message)s") logger = logging.getLogger("mcp-server") +set_logger_with_envs(logger) class MCPServer: """MCP server implementation.""" @@ -899,4 +902,4 @@ async def serve_sse(self, port: int): except Exception as e: logger.error(f"Server exited with error: {e}", exc_info=True) finally: - logger.info("Shutting down server.") \ No newline at end of file + logger.info("Shutting down server.") diff --git a/kubectl_mcp_tool/utils/logging_util.py b/kubectl_mcp_tool/utils/logging_util.py new file mode 100644 index 0000000..9b006e6 --- /dev/null +++ b/kubectl_mcp_tool/utils/logging_util.py @@ -0,0 +1,42 @@ +import logging +import os +import sys + + +def set_logger_with_envs(logger: logging.Logger): + """ + Set the logger with logging related environment variables + + TODO: This is temporary logger setting function. logger setting needs to be organized in the future. + + Args: + logger: logger to set with environment variables + """ + + logger.propagate = False + + # log level setting + if os.environ.get("MCP_DEBUG", "").lower() in ("1", "true"): + # MCP_DEBUG has higher priority than KUBECTL_MCP_LOG_LEVEL + log_level = logging.DEBUG + elif log_level_str := os.environ.get("KUBECTL_MCP_LOG_LEVEL"): + # log_level_str is "DEBUG", "INFO", "WARNING", or "ERROR" + log_level = getattr(logging, log_level_str.upper()) + else: + log_level = logging.INFO + + logger.setLevel(level=log_level) + + # NOTE: some script (e.g. mcp_server.py) loads logger twice when it runs. To prevent duplicate logging. + if not logger.handlers: + # logger handler setting + log_file = os.environ.get("MCP_LOG_FILE") + if log_file: + os.makedirs(os.path.dirname(log_file), exist_ok=True) + handler = logging.FileHandler(log_file) + else: + handler = logging.StreamHandler(sys.stderr) + + formatter = logging.Formatter("%(asctime)s - %(levelname)s - %(name)s - %(message)s") + handler.setFormatter(formatter) + logger.addHandler(handler)