الفكرة
لما تحصل مشكلة في إنتاج FastAPI، أسهل سؤال هو: «إيه الطلب اللي ورا السطر ده؟». من غير معرّف ارتباط يمسك كل اللوجز الناتجة عن نفس الطلب، بتفضل تجمع سطور متبعترة. loglens حلمت الحاجة دي: correlation id واحدة بتتولد للطلب وتتوارث تلقائيًا لأي task بيتعمل منه.
كيف تنتقل القيمة
المعرّف ساكن في contextvars.ContextVar، فده مقصوص على الـ task الحالي ومتوارث لأي task ابن، من غير ما تعدي القيمة بإيدك في كل دالة. مع Middleware قطعنها ASGI خالص، فشغالة في FastAPI و aiohttp وحتى ستارليت لوحدها.
الاعتيماء بالأسرار
الـ redaction شغال افتراضيًا: مفاتيح حساسة (password، token، authorization…) وأشكال معروفة (Bearer، JWTs، مفاتيح خاصة) بتتحجب تلقائيًا من المخرجات. تقدر تعطّله لمّا تكون محتاج تشوف القيم في بيئة متن الآمنة.
الاستخدام
import loglens
loglens.setup() # JSON في الإنتاج، ملوّن على الطرفية
with loglens.correlation() as cid:
logger.info("handling request", extra={"path": "/api/users"})
بيئتان سطر واحد: loglens.setup_dev() أو setup_prod()، مع متغيرات بيئة LOGLENS_LEVEL/LOGLENS_FORMAT/LOGLENS_REDACT.