diff --git a/.env.example b/.env.example index ec482ef..44c3f97 100644 --- a/.env.example +++ b/.env.example @@ -7,7 +7,6 @@ CLAUDE_WORKSPACE="./agent_workspace" MAX_CLI_SESSIONS=10 ALLOWED_DIR="" FAST_PREFIX_DETECTION=true -LOG_FULL_PAYLOADS=true ENABLE_NETWORK_PROBE_MOCK=true ENABLE_TITLE_GENERATION_SKIP=true diff --git a/config/settings.py b/config/settings.py index 61f338b..8d89ea2 100644 --- a/config/settings.py +++ b/config/settings.py @@ -29,9 +29,6 @@ class Settings(BaseSettings): # ==================== Fast Prefix Detection ==================== fast_prefix_detection: bool = True - # ==================== Logging ==================== - log_full_payloads: bool = False - # ==================== Optimizations ==================== enable_network_probe_mock: bool = True enable_title_generation_skip: bool = True diff --git a/providers/logging_utils.py b/providers/logging_utils.py index 348c859..0df59da 100644 --- a/providers/logging_utils.py +++ b/providers/logging_utils.py @@ -7,26 +7,10 @@ while maintaining full traceability through request IDs and content hashes. import hashlib import json import logging -import os -from datetime import datetime, timezone -from typing import Any, Dict, List, Optional +from typing import Any, Dict, List logger = logging.getLogger(__name__) -# Separate debug file handler for full payloads -_debug_handler: Optional[logging.FileHandler] = None - - -def _get_debug_handler() -> logging.FileHandler: - """Get or create the debug file handler.""" - global _debug_handler - if _debug_handler is None: - _debug_handler = logging.FileHandler( - "server_debug.jsonl", encoding="utf-8", mode="w" - ) - _debug_handler.setLevel(logging.DEBUG) - return _debug_handler - def generate_request_fingerprint(messages: List[Any]) -> str: """Generate unique short hash for message content. @@ -75,7 +59,7 @@ def get_last_user_message_preview(messages: List[Any], max_len: int = 100) -> st return "(no user message)" -def get_tool_names(tools: Optional[List[Any]], max_count: int = 5) -> List[str]: +def get_tool_names(tools: List[Any] | None, max_count: int = 5) -> List[str]: """Extract tool names from tool list, limiting to max_count.""" if not tools: return [] @@ -122,25 +106,13 @@ def build_request_summary(request_data: Any) -> Dict[str, Any]: } -def log_full_payload(request_id: str, payload: Dict[str, Any]) -> None: - """Write full payload to separate debug file for forensic analysis. - - Only writes if LOG_FULL_PAYLOADS env var is set to 'true'. - """ - if os.getenv("LOG_FULL_PAYLOADS", "false").lower() != "true": - return - - try: - handler = _get_debug_handler() - record = { - "timestamp": datetime.now(timezone.utc).isoformat(), - "request_id": request_id, - "payload": payload, - } - handler.stream.write(json.dumps(record, default=str) + "\n") - handler.stream.flush() - except Exception as e: - logger.warning(f"Failed to write debug payload: {e}") +def log_full_payload( + logger_instance: logging.Logger, request_id: str, payload: Dict[str, Any] +) -> None: + """Log full payload to the standard logger.""" + logger_instance.debug( + f"FULL_PAYLOAD [{request_id}]: {json.dumps(payload, default=str)}" + ) def log_request_compact( @@ -152,19 +124,18 @@ def log_request_compact( """Log a compact request summary with fingerprint for correlation. This is the main entry point for logging requests. It logs a single-line - JSON summary to the main log and optionally writes full payload to debug file. + JSON summary to the main log and always writes full payload. """ summary = build_request_summary(request_data) summary["request_id"] = request_id logger_instance.info(f"{prefix}: {json.dumps(summary)}") - # Optionally write full payload to debug file - if os.getenv("LOG_FULL_PAYLOADS", "false").lower() == "true": - try: - payload = ( - request_data.model_dump() if hasattr(request_data, "model_dump") else {} - ) - log_full_payload(request_id, payload) - except Exception as e: - logger.debug(f"Could not dump request data: {e}") + # Always log full payload + try: + payload = ( + request_data.model_dump() if hasattr(request_data, "model_dump") else {} + ) + log_full_payload(logger_instance, request_id, payload) + except Exception as e: + logger.debug(f"Could not dump request data: {e}")