تكرار السؤال: …
الإجابة المختصرة
استخدم logger.exception() داخل كتلة except (تسجل بمستوى ERROR مع الـ traceback)، أو مرر exc_info=True لأي مستوى آخر، بدل تسجيل str(err) فقط.
الشرح
رسالة الاستثناء وحدها لا تكفي للتشخيص؛ الـ traceback يحدد السطر والمسار. سجّل الخطأ مرة واحدة في الطبقة التي تتخذ القرار، واترك الطبقات الأخرى تمرره، حتى لا تتكرر السجلات لنفس الخطأ. أضف سياقًا مفيدًا (معرّف الطلب أو المستخدم) دون أسرار مثل كلمات المرور أو التوكنات. واستخدم صيغة المعاملات logger.info("user %s", uid) بدل f-strings ليؤجل التنسيق.
مثال بالكود
import logging
logger = logging.getLogger(__name__)
def handle(order_id: int) -> None:
try:
process(order_id)
except PaymentError:
logger.exception("payment failed for order %s", order_id)
raiseأخطاء شائعة
- تسجيل logger.error(str(e)) فيضيع الـ traceback.
- تسجيل نفس الاستثناء في كل طبقة يمر بها مما يغرق السجلات بالتكرار.