از طریق منوی جستجو مطلب مورد نظر خود در وبلاگ را به سرعت پیدا کنید
اصول ثبت پایتون
سرفصلهای مطلب
معرفی
ورود به سیستم به شما کمک میکند تا رویدادهایی را که در طول اجرای کدتان اتفاق میافتد را پیگیری کنید، که میتواند در آینده برای اهداف اشکالزدایی استفاده شود. تصویر بهتری از جریان برنامه ارائه می دهد و به توسعه دهندگان کمک می کند تا منبع خطاهایی را که در حین اجرای کد شما رخ می دهد ردیابی کنند و در نتیجه قابلیت نگهداری برنامه را افزایش می دهد.
در پایتون، بیشتر ویژگیهای اصلی ثبتنام توسط کتابخانه استاندارد پایتون ارائه میشود. از این رو، می توانید به راحتی و بدون هیچ گونه تنظیمات اضافی، لاگ را به برنامه خود اضافه کنید. ماژول استاندارد ورود به سیستم توسعه دهنده را قادر می سازد تا پیام های وضعیت را در یک فایل یا هر جریان خروجی دیگری بنویسد.
را logging
مدول
را logging
ماژول بهطور پیشفرض به راحتی در محیطهای پایتون در دسترس است و یک لاگر پیشفرض به نام «root”. توابع و کلاس هایی را که عملکرد ورود به سیستم را پیاده سازی می کنند، تعریف می کند.
API ورود به سیستم ارائه شده توسط کتابخانه استاندارد به شما امکان می دهد پیام های خود را در گزارش برنامه اضافه کنید و همچنین با پیام های ماژول های شخص ثالث یکپارچه شوید. همچنین مکانیزمی برای حاشیه نویسی پیام های گزارش با منبع، مهر زمانی، شدت و سایر ابرداده ها فراهم می کند که به تجزیه و تحلیل گزارش کمک می کند.
انواع ورود به سیستم (سطوح گزارش)
هر پیام گزارش با یک سطح شدت همراه است، که یک عدد صحیح است که برای نشان دادن بحرانی بودن رویداد(های) ثبت شده استفاده می شود. ماژول ورود به سیستم دارای یک تابع کمکی برای هر سطح گزارش است – اینها با توجه به سطح گزارش نامگذاری می شوند. در زیر، لیستی از سطوح ورود به سیستم به همراه استفاده توصیه شده از آنها وجود دارد.
-
اشکال زدایی (
logger.debug
): خروجی بسیار دقیق ارائه می دهد. برای تشخیص مشکلات استفاده می شود. -
اطلاعات (
logger.info
): اطلاعاتی را ارائه می دهد روی اجرای موفق تأیید می کند که آیا کارها مطابق انتظار کار می کنند یا خیر. -
هشدار (
logger.warn
یاlogger.warning
): در مورد مشکلی که ممکن است در آینده رخ دهد یا خطای قابل بازیابی، هشداری صادر کنید. -
خطا (
logger.error
): نشان دهنده مشکلی در نرم افزار است زیرا طبق انتظار اجرا نمی شود. -
بحرانی (
logger.critical
): نشان دهنده یک خطای جدی است که ممکن است اجرای برنامه را متوقف کند.
به طور پیش فرض، root Logger برای گزارش همه پیام ها در سطح هشدار یا بالاتر از آن تنظیم شده است – هر پیامی که زیر این سطح باشد فیلتر می شود. با این حال، این امکان وجود دارد که ماژول را به صراحت پیکربندی کنید تا در فیلترینگ کم و بیش انتخابی باشد.
برای اضافه کردن لاگ به اسکریپت پایتون، فقط import ماژول با استفاده از import logging
، و پس از موفقیت آمیز import اسکریپت می تواند پیام ها را با استفاده از logging.*
روش هایی مانند logging.debug()
.
در اینجا می توانید یک مثال ساده از ماژول ورود به سیستم را مشاهده کنید:
import logging
logging.warning("Caution: This is the root logger!")
خروجی:
WARNING:root:Caution: This is the root logger!
اشیاء Logger
را logging
ماژول به کاربر این امکان را می دهد که چندین شیء لاگر ایجاد کند. انواع مختلفی از اشیاء لاگر را می توان برای به دست آوردن کنترل دقیق بر روش ثبت پیام های بخش های مختلف برنامه پایتون استفاده کرد – برای مثال، برنامه اصلی پایتون می تواند از root
logger در حالی که کتابخانه های شخص ثالث استفاده شده از داخل این برنامه می توانند از اشیاء ثبت کننده خود با تنظیمات خاص خود استفاده کنند.
هنگام استفاده از پیش فرض root
توابع لاگر، می توانیم توابع را مستقیماً فراخوانی کنیم، به عنوان مثال، logging.debug()
. این امکان وجود دارد که با ایجاد یک شی از لاگر خود را پیکربندی کنید Logger
class، و این می تواند مفید باشد اگر برنامه شما دارای چندین ماژول باشد.
بیایید نگاهی به برخی از کلاس ها و توابع موجود در آن بیاندازیم logging
مدول. کلاس های اصلی و عملکرد آنها به شرح زیر است:
-
Loggers – رابط کاربری که برنامه استفاده می کند را نشان می دهد. اشیاء این کلاس مستقیماً برای فراخوانی توابع در برنامه استفاده می شوند.
-
Handlers – پیام های گزارش را به مکان مناسب در نرم افزار مانند خروجی استاندارد می فرستد console، یک فایل، از طریق HTTP یا حتی ایمیل (از طریق SMTP).
-
فیلترها – کنترل دقیقی بر انتخاب رکوردهای گزارش برای نمایش می دهد.
-
Formatters – طرح نهایی رکوردهای گزارش را مشخص می کند و ویژگی هایی را که خروجی باید شامل شود را مشخص می کند.
از این میان، اشیاء از Logger
کلاس بیشتر استفاده می شود.
برای ایجاد یک لاگر جدید، می توانیم از logging.getLogger()
روش. در اسکریپت زیر، خطاها را با استفاده از log ثبت میکنیم root
لاگر و همچنین لاگر سفارشی ما my_logger
.
import logging
my_logger = logging.getLogger("My Logger")
logging.error("Error: Root Log")
my_logger.error("Error: My Logger log")
خروجی:
ERROR:root:Error: Root Log
ERROR:My Logger:Error: My Logger log
هر پیام گزارش نه تنها منبع را نشان میدهد – شیء ثبتکنندهای که از طریق آن ثبت شده است – بلکه یک پیام مبتنی بر آن را نشان میدهد. روی پیکربندی آن شی لاگر.
در بخشهای بعدی، گزینههای پیکربندی مختلف آبجکتهای لاگر را بررسی خواهیم کرد.
ورود به فایل در مقابل خروجی استاندارد
بهطور پیشفرض، اشیاء لاگر، گزارشها را به خروجی استاندارد خروجی میدهند. می توانید استفاده کنید basicConfig()
روشی برای تغییر این پارامتر و سایر پارامترها. در زیر لیستی از پارامترها برای basicConfig
روش:
- سطح: یک سطح شدت برای لاگر تعیین کنید. هیچ پیامی کمتر از این سطح شدت ثبت نخواهد شد.
- filename: نام فایلی که لاگ ها در آن نوشته می شوند.
- filemode: حالتی که در آن فایل مشخص شده، در صورت وجود، باید باز شود.
- format: فرمت پیام گزارش را مشخص می کند. این یک رشته با
LogRecord
ویژگی های.
LogRecord
شی حاوی اطلاعات رویدادهایی است که ثبت شده اند، مانند شماره خط، زمان، نام لاگر و غیره. بحث در مورد شی LogRecord خارج از محدوده این مقاله است اما اطلاعات بیشتری در دسترس است. اینجا.
در زیر خلاصه ای از مراحلی است که باید برای ثبت رویدادهای گزارش در یک فایل دنبال شود:
- ماژول ورود به سیستم را وارد کنید.
- لاگر را با استفاده از پیکربندی کنید
basicConfig
روش - ایجاد یک شی لاگر.
- تنظیم مقدار آستانه لاگر.
- از روش های ثبت نام استفاده کنید.
این را با یک مثال بهتر می توان فهمید:
import logging
logger = logging.getLogger()
logging.basicConfig(filename="test.log", format='%(filename)s: %(message)s', filemode='w')
logger.setLevel(logging.DEBUG)
logger.debug("This is a debug message")
logger.info("For your info")
logger.warning("This is a warning message")
logger.error("This is an error message")
logger.critical("This is a critical message")
اسکریپت بالا یک فایل ایجاد می کند test.log
. فایل حاوی اطلاعات ورود به سیستم زیر خواهد بود:
test_logger.py: This is a debug message
test_logger.py: For your info
test_logger.py: This is a warning message
test_logger.py: This is an error message
test_logger.py: This is a critical message
تاریخ/زمان در پیامهای ورود
برای نمایش تاریخ و زمان وقوع یک رویداد می توانید استفاده کنید %(asctime)s
در رشته فرمت شما در basicConfig()
تابع. مثلا:
import logging
logging.basicConfig(format='%(asctime)s %(message)s')
logging.warning('is the time the Admin logged out.')
خروجی:
2018-12-17 10:52:15,463 is the time the Admin logged out.
اگر میخواهید روش نمایش تاریخ/زمان را تغییر دهید، میتوانید با استفاده از آن پیکربندی کنید datefmt
پارامتر از basicConfig
روش.
متغیرهای ورود به سیستم
در برنامه های دنیای واقعی، ما باید گزارش های خروجی را با توجه به تغییرات دینامیکی که در برنامه ما اتفاق می افتد، تولید کنیم. همانطور که در مثال بالا مشاهده می شود، متدهای ورود به سیستم یک رشته را به عنوان آرگومان می گیرند. علاوه بر این، میتوانیم متغیرها را وارد کنیم و رشته را با متغیرهایی قالببندی کنیم و سپس آن را به متد log ارسال کنیم. در زمان اجرا، مقدار متغیرها در پیامهای گزارش خروجی داده میشود.
در اینجا یک مثال از آن با استفاده از قالب بندی رشته آورده شده است:
import logging
status = "connection unavailable"
logging.error("System reported: %s", status)
خروجی:
ERROR:root:System reported: connection unavailable
شروع با Python 3.6 f-Strings می تواند به عنوان جایگزینی برای تعیین کننده های قالب رشته ای استفاده شود، بنابراین در صورت وجود چندین پارامتر، کد را به راحتی قابل خواندن نگه می دارد. با استفاده از رشته های f می توانید هر عبارت پایتون را به عنوان بخشی از پیام مشخص کنید و در طول زمان اجرا ارزیابی می شود و نتیجه در پیام های گزارش جاسازی می شود.
مثال بالا را می توان با استفاده از یک رشته f دوباره نوشت:
import logging
status = "connection unavailable"
logging.error(f'System reported: {status}')
ثبت ردیابی پشته
ضبط ردیابی پشته در برنامه شما نیز توسط ماژول ورود به سیستم پشتیبانی می شود. تنظیم کردن exc_info
پارامتر به True
در حالی که فراخوانی توابع ورود به سیستم به ما امکان می دهد تا اطلاعات استثنا را ضبط کنیم. با استفاده از این تابع، می توانیم اطلاعاتی در مورد استثنایی که در حال حاضر در حال رسیدگی است به دست آوریم. اطلاعات مربوط به رشته فعلی و قاب پشته فعلی است.
import logging
my_list = (1, 2)
try:
print(my_list(3))
except Exception as e:
logging.error("Caught Exception!", exc_info=True)
خروجی:
ERROR:root:Caught Exception!
Traceback (most recent call last):
File "index.py", line 5, in <module>
print(my_list(3)) # Index out of range
IndexError: list index out of range
در صورتی که استثناها توسط قاب پشته فعلی مدیریت نشود، اطلاعات از تماس گیرنده آن (یعنی فریم پشته فراخوان) به دست می آید و به همین ترتیب روی تا زمانی که یک قاب پشته ای برای رسیدگی به استثنا پیدا کند. قاب پشته دارای اطلاعات جدیدترین استثنا است.
اگر پشته هیچ استثنایی نداشته باشد، یک تاپل که دارد None
مقدار برگردانده می شود. در غیر این صورت تابع مقدار را برمی گرداند type
(نوع استثنایی که مدیریت می شود)، مقدار (پارامتر استثنا) و ردیابی (شیء ردیابی که پشته تماس را در جایی که استثنا در ابتدا رخ داده است، محصور می کند).
نتیجه
طراحی ماژول ورود به سیستم بسیار کاربردی است و ویژگی های آماده برای ورود به سیستم را ارائه می دهد که می تواند گزارش اولیه را به یک پروژه کوچک اضافه کند. می توان آن را به راحتی با استفاده از اشیاء لاگر و گزینه های پیکربندی غنی آنها برای پشتیبانی از نیازهای حتی سخت ترین برنامه ها گسترش داد. علاوه بر پیامها، ماژول گزارشگیری همچنین میتواند برای ثبت استثناها و پشتهسازی ردیابیها نیز استفاده شود. این آموزش پایه را به پایان می رساند روی پیاده سازی لاگ در پایتون
(برچسبها به ترجمه)# python
منتشر شده در 1403-01-25 16:16:03