آموزش سریع خطایابی در پایتون | خطایابی پیشرفته

استفاده از logging برای خطایابی

تا اینجا یاد گرفتیم که با print می‌توانیم مقادیر متغیرها را در کنسول ببینیم و خطاهای منطقی را پیدا کنیم. اما در پروژه‌های واقعی (مخصوصاً برنامه‌هایی که در سرور اجرا می‌شوند یا فایل‌های حجیم پردازش می‌کنند)، استفاده از print محدودیت‌هایی دارد: تمام پیام‌ها در خروجی استاندارد چاپ می‌شوند و قابل مدیریت نیستند. اینجاست که logging (سیستم ثبت رویداد) به کمک می‌آید.

logging یک ماژول داخلی پایتون است که به شما اجازه می‌دهد پیام‌ها را با سطوح مختلف (مانند DEBUG، INFO، WARNING، ERROR و CRITICAL) ثبت کنید. این پیام‌ها می‌توانند در کنسول، در یک فایل، یا حتی از طریق ایمیل ارسال شوند.

سطوح پیام (از کم‌اهمیت به پراهمیت):

  1. DEBUG (شماره ۱۰): برای اطلاعات دقیق و جزئیات در هنگام خطایابی، معمولاً در محیط توسعه استفاده می‌شود.
  2. INFO (شماره ۲۰): تأیید می‌کند که برنامه طبق انتظار کار می‌کند.
  3. WARNING (شماره ۳۰): نشان‌دهنده یک مشکل احتمالی است (مثلاً فضای دیسک رو به اتمام است).
  4. ERROR (شماره ۴۰): یک مشکل جدی که برنامه نمی‌تواند بخشی از کار را انجام دهد.
  5. CRITICAL (شماره ۵۰): یک مشکل بسیار جدی که ممکن است برنامه را متوقف کند.

مثال ساده بدون تنظیمات خاص:

import logging

logging.warning("این یک هشدار است!")
logging.error("این یک خطا است!")

خروجی:

WARNING:root:این یک هشدار است!
ERROR:root:این یک خطا است!

توجه کنید که DEBUG و INFO به طور پیش‌فرض چاپ نمی‌شوند (چون سطح پیش‌فرض WARNING است).

تنظیم سطح و خروجی:
می‌توانید مشخص کنید کدام سطوح نمایش داده شوند و پیام‌ها به چه شکلی ظاهر شوند:

import logging

logging.basicConfig(level=logging.DEBUG, format='%(levelname)s - %(message)s')

logging.debug("این یک پیام debug است")
logging.info("این یک پیام info است")
logging.error("این یک پیام error است")

خروجی:

DEBUG - این یک پیام debug است
INFO - این یک پیام info است
ERROR - این یک پیام error است

نوشتن لاگ در فایل:
به جای کنسول، می‌توانید لاگ‌ها را در یک فایل ذخیره کنید تا بعداً بررسی شوند:

import logging

logging.basicConfig(filename='app.log', level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s')

logging.info("برنامه شروع شد")
logging.error("خطا در باز کردن فایل")

حالا فایل app.log ایجاد می‌شود و پیام‌ها با زمان ثبت به آن اضافه می‌شوند.

تمرین عملی:
برنامه زیر را با استفاده از logging بازنویسی کنید تا به جای print، از logging.debug و logging.error استفاده کند:

def divide(a, b):
    if b == 0:
        print("خطا: تقسیم بر صفر")
        return None
    return a / b

result = divide(10, 0)
print("نتیجه:", result)

راه‌حل:

import logging
logging.basicConfig(level=logging.DEBUG, format='%(levelname)s - %(message)s')

def divide(a, b):
    logging.debug(f"تابع divide با مقادیر a={a} و b={b} فراخوانی شد")
    if b == 0:
        logging.error("تلاش برای تقسیم بر صفر")
        return None
    result = a / b
    logging.debug(f"نتیجه تقسیم: {result}")
    return result

result = divide(10, 0)
logging.info(f"نتیجه نهایی: {result}")

با این کار، شما یک سیستم ردیابی دارید که می‌تواند سطح پیام، زمان وقوع و جزئیات را ثبت کند – بدون اینکه کد اصلی شما شلوغ شود. در بخش‌های بعدی یاد می‌گیرید که این لاگ‌ها را در برنامه‌های پیچیده‌تر (مانند توابع بازگشتی) نیز به کار ببرید.

پرسش و پاسخ این درس

برای ثبت پرسش ابتدا در سایت وارد شوید.

  • 1
  • 2
  • 3