पाठ 23 / 25

Logging और Observability

हर tool call को सुरक्षित रूप से log करें ताकि विफलताएँ trace हों और ख़र्च समझ आए।

पढ़ने योग्य trace

हर call के लिए दर्ज करें: समय, tool का नाम, छिपाए गए arguments, अवधि, सफलता या error, और नतीजे का आकार। इनसे आप जवाब दे सकते हैं "agent ने ऐसा क्यों किया?" और "कौन-सा tool धीमा या विफल है?" Standard error या file में log करें, और लिखने से पहले secrets और व्यक्तिगत डेटा छिपा दें।

Logging wrapper

Tool functions को wrap करें ताकि हर call का समय और log दर्ज हो। redact संवेदनशील मान हटाता है। Log standard error के logger में जाता है, stdio server पर stdout में कभी नहीं।

import functools, logging, time
log = logging.getLogger("mcp.tools")

def logged(fn):
    @functools.wraps(fn)
    def wrapper(*args, **kwargs):
        start = time.perf_counter()
        try:
            return fn(*args, **kwargs)
        finally:
            ms = (time.perf_counter() - start) * 1000
            log.info("tool=%s args=%s ms=%.0f", fn.__name__, redact(kwargs), ms)
    return wrapper

त्वरित जाँच: Arguments को log करने से पहले क्या करना चाहिए?

  • कुछ नहीं, सब कुछ log करें
  • Secrets और व्यक्तिगत डेटा छिपाएँ
  • उनका हिंदी अनुवाद करें
  • Server को encrypt करें
Answer

Secrets और व्यक्तिगत डेटा छिपाएँ — Logs व्यापक रूप से पढ़े जाते हैं और लंबे समय रहते हैं, इसलिए संवेदनशील मान उनमें नहीं लिखने चाहिए।