GeezerVisonThe World Wide Web, restored to 800 pixels of glory. | ||||||||||||||||||||||||||||||||||||||||||||||||||
| Home|About|Gaming cabinet|Archives|How it works|Starter sites | ||||||||||||||||||||||||||||||||||||||||||||||||||
GeezerVison is showing python.github.io — راهنمای گزارشگیری راهنمای گزارشگیری¶این صفحه شامل اطلاعات آموزشی است. برای پیوندهایی به اطلاعات مرجع و یک کتابچهی آشپزی برای گزارشگیری (logging cookbook)، لطفاً منابع دیگر را ببینید. آموزش مقدماتی گزارشگیری¶ثبت رویداد راهی برای پیگیری رویدادهایی است که هنگام اجرای یک نرمافزار رخ میدهند. توسعهدهندهی نرمافزار فراخوانیهای ثبت رویداد را به کد خود اضافه میکند تا نشان دهد رویدادهای خاصی رخ دادهاند. یک رویداد با یک پیام توصیفی توصیف میشود که میتواند بهصورت اختیاری حاوی دادههای متغیر باشد (یعنی دادههایی که ممکن است برای هر وقوع رویداد متفاوت باشند). رویدادها همچنین دارای اهمیتی هستند که توسعهدهنده به رویداد نسبت میدهد؛ این اهمیت را میتوان سطح یا شدت نیز نامید. چه زمانی از گزارشگیری استفاده کنیم¶شما میتوانید با ایجاد یک گزارشگیر از طریق
متدهای گزارشگیر بر اساس سطح یا شدت رویدادهایی که برای پیگیری آنها استفاده میشوند، نامگذاری شدهاند. سطحهای استاندارد و موارد کاربرد آنها در زیر شرح داده شدهاند (بهترتیب افزایشی شدت):
سطح پیشفرض رویدادهایی که پیگیری میشوند را میتوان به روشهای مختلفی مدیریت کرد. سادهترین روش برای مدیریت رویدادهای پیگیریشده، چاپ آنها در کنسول است. یک روش رایج دیگر، نوشتن آنها در یک پرونده روی دیسک است. یک مثال ساده¶یک مثال بسیار ساده: import logging logging.warning('Watch out!') # will print a message to the console logging.info('I told you so') # will not print anything اگر این سطرها را در یک اسکریپت وارد کنید و آن را اجرا کنید، خواهید دید: WARNING:root:مراقب باشید! در کنسول چاپ میشود. پیام توجه داشته باشید که در این مثال، بهجای ایجاد یک گزارشگیر و فراخوانی توابع آن، مستقیماً از توابع ماژول گزارشگیری در یک پرونده¶یک حالت بسیار رایج، ثبت رویدادهای گزارش در یک پرونده است، بنابراین در ادامه به بررسی آن میپردازیم. حتماً موارد زیر را در یک مفسر پایتون که بهتازگی آغاز شده است آزمایش کنید و صرفاً از نشست توصیفشده در بالا ادامه ندهید: import logging logger = logging.getLogger(__name__) logging.basicConfig(filename='example.log', encoding='utf-8', level=logging.DEBUG) logger.debug('This message should go to the log file') logger.info('So should this') logger.warning('And this, too') logger.error('And non-ASCII stuff, too, like Øresund and Malmö') تغییر یافته در نسخهی 3.9: آرگومان encoding افزوده شد. در نسخههای پیشین پایتون، یا اگر مشخص نشده باشد، کدگذاری استفادهشده مقدار پیشفرضی است که توسط و اکنون اگر پرونده را باز کنیم و به آنچه داریم نگاه کنیم، باید پیامهای گزارش را پیدا کنیم: DEBUG:__main__:این پیام باید به پرونده گزارش برود INFO:__main__:این پیام هم همینطور WARNING:__main__:و این هم همینطور ERROR:__main__:و موارد غیر اسکی (non-ASCII) نیز، مانند Øresund و Malmö این مثال همچنین نشان میدهد که چگونه میتوانید سطح گزارشگیری را تنظیم کنید که بهعنوان آستانهای برای پیگیری عمل میکند. در این مورد، چون آستانه را روی اگر میخواهید سطح گزارش را از طریق یک گزینهی خط فرمان تنظیم کنید، مانند: --log=INFO و مقدار پارامتر دادهشده برای getattr(logging, loglevel.upper()) برای دریافت مقداری که آن را از طریق آرگومان level به # assuming loglevel is bound to the string value obtained from the # command line argument. Convert to upper case to allow the user to # specify --log=DEBUG or --log=debug numeric_level = getattr(logging, loglevel.upper(), None) if not isinstance(numeric_level, int): raise ValueError('Invalid log level: %s' % loglevel) logging.basicConfig(level=numeric_level, ...) فراخوانی اگر اسکریپت بالا را چند بار اجرا کنید، پیامهای اجراهای پیاپی به پرونده example.log افزوده میشوند. اگر میخواهید هر اجرا از نو آغاز شود و پیامهای اجراهای پیشین را به خاطر نداشته باشد، میتوانید با تغییر فراخوانی در مثال بالا به شکل زیر، آرگومان filemode را مشخص کنید: logging.basicConfig(filename='example.log', filemode='w', level=logging.DEBUG) خروجی مانند قبل خواهد بود، اما دیگر به پرونده گزارش الحاق نمیشود، بنابراین پیامهای اجراهای پیشین از دست میروند. ثبت دادههای متغیر¶برای ثبت دادههای متغیر، از یک رشته قالب برای پیام توصیف رویداد استفاده کنید و دادههای متغیر را بهعنوان آرگومان اضافه کنید. برای مثال: import logging logging.warning('%s before you %s', 'Look', 'leap!') نمایش خواهد داد: WARNING:root:پیش از اقدام، تأمل کنید! همانطور که میبینید، ادغام دادههای متغیر در پیام توصیف رویداد از سبک قدیمی قالببندی رشته با %-style استفاده میکند. این برای سازگاری با نسخههای قدیمی است: بستهی logging پیش از گزینههای قالببندی جدیدتری مانند تغییر قالب پیامهای نمایشدادهشده¶برای تغییر قالبی که برای نمایش پیامها استفاده میشود، باید قالبی را که میخواهید استفاده کنید، مشخص کنید: import logging logging.basicConfig(format='%(levelname)s:%(message)s', level=logging.DEBUG) logging.debug('This message should appear on the console') logging.info('So should this') logging.warning('And this, too') که این را چاپ خواهد کرد: DEBUG:این پیام باید در کنسول ظاهر شود INFO:این پیام نیز همینطور WARNING:و این پیام نیز همینطور توجه داشته باشید که 'root' که در مثالهای پیشین ظاهر شده بود، ناپدید شده است. برای مشاهده مجموعه کاملی از مواردی که میتوانند در رشتههای قالب ظاهر شوند، میتوانید به مستندات ویژگیهای LogRecord مراجعه کنید، اما برای استفاده ساده، فقط به levelname (شدت)، message (توصیف رویداد، شامل دادههای متغیر) و احتمالاً به نمایش زمان وقوع رویداد نیاز دارید. این موضوع در بخش بعدی توضیح داده شده است. نمایش تاریخ/زمان در پیامها¶برای نمایش تاریخ و زمان یک رویداد، '%(asctime)s' را در رشته قالب خود قرار میدهید: import logging logging.basicConfig(format='%(asctime)s %(message)s') logging.warning('is when this event was logged.') که باید چیزی شبیه به این چاپ کند: 2010-12-12 11:41:42,612 زمانی است که این رویداد ثبت شد. قالب پیشفرض برای نمایش تاریخ/زمان (که در بالا نشان داده شد) مانند ISO8601 یا RFC 3339 است. اگر به کنترل بیشتری بر قالببندی تاریخ/زمان نیاز دارید، یک آرگومان datefmt به import logging logging.basicConfig(format='%(asctime)s %(message)s', datefmt='%m/%d/%Y %I:%M:%S %p') logging.warning('is when this event was logged.') که چیزی شبیه به این را نمایش میدهد: این رویداد در ۱۲/۱۲/۲۰۱۰ ۱۱:۴۶:۳۶ ق.ظ ثبت شده است. قالب آرگومان datefmt همان قالبی است که گامهای بعدی¶این آموزش مقدماتی به پایان رسید. این باید برای شروع کار شما با logging کافی باشد. بستهی logging امکانات بسیار بیشتری ارائه میدهد، اما برای بهرهمندی هرچه بهتر از آن، لازم است کمی بیشتر زمان خود را صرف خواندن بخشهای بعدی کنید. اگر برای این کار آمادهاید، نوشیدنی دلخواهتان را بردارید و ادامه دهید. اگر نیازهای شما به گزارش ساده هستند، از مثالهای بالا برای گنجاندن گزارش در اسکریپتهای خود استفاده کنید و اگر با مشکلی مواجه شدید یا چیزی را متوجه نشدید، لطفاً پرسش خود را در دستهی Help در انجمن گفتگوی پایتون ارسال کنید؛ باید بهزودی کمک دریافت کنید. هنوز اینجا هستید؟ میتوانید به خواندن چند بخش بعدی ادامه دهید، که آموزشی کمی پیشرفتهتر/عمیقتر از آموزش پایهی بالا ارائه میدهند. پس از آن، میتوانید نگاهی به کتاب آشپزی گزارشگیری (Logging Cookbook) بیندازید. آموزش پیشرفته گزارشگیری¶کتابخانهی logging رویکردی ماژولار دارد و چندین دسته از کامپوننتها را ارائه میدهد: گزارشگیرها، هندلرها، فیلترها و قالببندها (formatters).
اطلاعات رویداد گزارش بین گزارشگیرها، هندلرها، فیلترها و قالببندها در یک نمونه از گزارش کردن با فراخوانی متدهای نمونههایی از کلاس یک قرارداد خوب هنگام نامگذاری گزارشگیرها این است که در هر ماژولی که از گزارشگیری استفاده میکند، از یک گزارشگیر سطح ماژول با نام زیر استفاده کنید: logger = logging.getLogger(__name__) این بدان معناست که نامهای گزارشگیر سلسلهمراتب بسته/ماژول را پیگیری میکنند، و تنها از روی نام گزارشگیر بهطور شهودی آشکار است که رویدادها کجا ثبت میشوند. ریشهی سلسلهمراتب گزارشگیرها، گزارشگیر ریشه نامیده میشود. این همان گزارشگیری است که توابع البته، امکان ثبت پیامهای گزارش در مقصدهای مختلف وجود دارد. پشتیبانی برای نوشتن پیامهای گزارش در پروندهها، مکانهای HTTP GET/POST، ایمیل از طریق SMTP، سوکتهای عام، صفها، یا سازوکارهای گزارش مختص سیستمعامل مانند syslog یا گزارش رویداد ویندوز NT در این بسته گنجانده شده است. مقصدها توسط کلاسهای handler سرویسدهی میشوند. اگر نیازهای خاصی دارید که توسط هیچیک از کلاسهای handler توکار برآورده نمیشوند، میتوانید کلاس مقصد گزارش خود را بسازید. بهطور پیشفرض، هیچ مقصدی برای پیامهای گزارش تنظیم نشده است. میتوانید با استفاده از قالب پیشفرضی که severity:logger name:message شما میتوانید این را با فرستادن یک رشتهی قالب به جریان گزارشگیری¶جریان اطلاعات رویداد گزارش در گزارشگیرها و هندلرها در نمودار زیر نشان داده شده است. گزارشگیرها¶اشیای پرکاربردترین متدهای اشیای گزارشگیر به دو دسته تقسیم میشوند: پیکربندی و ارسال پیام. اینها رایجترین متدهای پیکربندی هستند:
نیازی نیست همیشه این متدها را روی هر گزارشگیر که ایجاد میکنید فراخوانی کنید. دو پاراگراف آخر این بخش را ببینید. با پیکربندی شیء logger، متدهای زیر پیامهای گزارش ایجاد میکنند:
گزارشگیرها مفهومی به نام سطح مؤثر دارند. اگر سطحی بهصراحت روی یک گزارشگیر تنظیم نشده باشد، در عوض سطح والد آن بهعنوان سطح مؤثر آن استفاده میشود. اگر والد سطح صریحی تنظیمشده نداشته باشد، والد آن بررسی میشود، و به همین ترتیب — تمام نیاکان جستجو میشوند تا سطحی که بهصراحت تنظیم شده باشد پیدا شود. گزارشگیر ریشه همیشه سطح صریحی تنظیمشده دارد (بهطور پیشفرض گزارشگیرهای فرزند پیامها را به هندلرهای مرتبط با گزارشگیرهای اجدادی خود منتشر میکنند. به همین دلیل، نیازی به تعریف و پیکربندی هندلرها برای تمام گزارشگیرهایی که یک برنامه از آنها استفاده میکند، نیست. کافی است هندلرها را برای یک گزارشگیر سطح بالا پیکربندی کنید و گزارشگیرهای فرزند را در صورت نیاز ایجاد کنید. (با این حال، میتوانید با تنظیم ویژگی propagate یک گزارشگیر روی هندلرها¶اشیاء کتابخانه استاندارد شامل تعداد نسبتاً زیادی از انواع هندلر است (به هندلرهای مفید مراجعه کنید)؛ آموزشها در مثالهای خود عمدتاً از در یک هندلر، متدهای بسیار کمی وجود دارد که توسعهدهندگان برنامه باید به آنها بپردازند. تنها متدهای هندلر که به نظر میرسد برای توسعهدهندگان برنامهای که از اشیای هندلر توکار استفاده میکنند (یعنی هندلرهای سفارشی ایجاد نمیکنند) مرتبط باشند، متدهای پیکربندی زیر هستند:
کد برنامه نباید مستقیماً از قالببندها¶اشیاء قالببند (Formatter) ترتیب نهایی، ساختار و محتوای پیام گزارش را پیکربندی میکنند. برخلاف کلاس پایهی
اگر رشتهی قالب پیام وجود نداشته باشد، بهطور پیشفرض از پیام خام استفاده میشود. اگر رشتهی قالب تاریخ وجود نداشته باشد، قالب تاریخ پیشفرض عبارت است از: %Y-%m-%d %H:%M:%S با میلیثانیههایی که در انتها اضافه شدهاند. اگر تغییر یافته در نسخهی 3.2: پارامتر رشتهی قالب پیام زیر، زمان را در قالبی خوانا برای انسان، شدت پیام و محتوای پیام را به همین ترتیب ثبت میکند: '%(asctime)s - %(levelname)s - %(message)s' قالببندکنندهها از یک تابع قابلپیکربندی توسط کاربر برای تبدیل زمان ایجاد یک رکورد به یک تاپل استفاده میکنند. بهطور پیشفرض، از پیکربندی گزارشگیری¶برنامهنویسان میتوانند گزارشگیری را به سه روش پیکربندی کنند:
برای مستندات مرجع در مورد دو گزینهی آخر، به توابع پیکربندی مراجعه کنید. مثال زیر با استفاده از کد پایتون، یک گزارشگیر بسیار ساده، یک هندلر کنسول (console handler) و یک قالببند (formatter) ساده را پیکربندی میکند: import logging # create logger logger = logging.getLogger('simple_example') logger.setLevel(logging.DEBUG) # create console handler and set level to debug ch = logging.StreamHandler() ch.setLevel(logging.DEBUG) # create formatter formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') # add formatter to ch ch.setFormatter(formatter) # add ch to logger logger.addHandler(ch) # 'application' code logger.debug('debug message') logger.info('info message') logger.warning('warn message') logger.error('error message') logger.critical('critical message') اجرای این ماژول از خط فرمان، خروجی زیر را تولید میکند: $ python simple_logging_module.py 2005-03-19 15:10:26,618 - simple_example - DEBUG - debug message 2005-03-19 15:10:26,620 - simple_example - INFO - info message 2005-03-19 15:10:26,695 - simple_example - WARNING - warn message 2005-03-19 15:10:26,697 - simple_example - ERROR - error message 2005-03-19 15:10:26,773 - simple_example - CRITICAL - critical message ماژول پایتون زیر یک گزارشگیر، هندلر و قالببند (formatter) تقریباً یکسان با موارد موجود در مثال ذکرشده در بالا ایجاد میکند، با این تفاوت که تنها نام اشیاء متفاوت است: import logging import logging.config logging.config.fileConfig('logging.conf') # create logger logger = logging.getLogger('simpleExample') # 'application' code logger.debug('debug message') logger.info('info message') logger.warning('warn message') logger.error('error message') logger.critical('critical message') در اینجا پرونده logging.conf آمده است: [loggers] keys=root,simpleExample [handlers] keys=consoleHandler [formatters] keys=simpleFormatter [logger_root] level=DEBUG handlers=consoleHandler [logger_simpleExample] level=DEBUG handlers=consoleHandler qualname=simpleExample propagate=0 [handler_consoleHandler] class=StreamHandler level=DEBUG formatter=simpleFormatter args=(sys.stdout,) [formatter_simpleFormatter] format=%(asctime)s - %(name)s - %(levelname)s - %(message)s خروجی تقریباً با خروجی مثال غیرمبتنی بر پرونده پیکربندی یکسان است: $ python simple_logging_config.py 2005-03-19 15:38:55,977 - simpleExample - DEBUG - debug message 2005-03-19 15:38:55,979 - simpleExample - INFO - info message 2005-03-19 15:38:56,054 - simpleExample - WARNING - warn message 2005-03-19 15:38:56,055 - simpleExample - ERROR - error message 2005-03-19 15:38:56,130 - simpleExample - CRITICAL - critical message میتوانید ببینید که روش پرونده پیکربندی چند مزیت نسبت به روش کد پایتون دارد، عمدتاً جداسازی پیکربندی و کد و توانایی افراد غیربرنامهنویس برای تغییر آسان ویژگیهای گزارشگیری. هشدار تابع دیکشنری دادهشده به توجه داشته باشید که نام کلاسهای ارجاعشده در پروندههای پیکربندی باید یا نسبت به ماژول logging نسبی باشند، یا مقادیر مطلقی باشند که بتوان آنها را با استفاده از سازوکارهای عادی ایمپورت حل کرد. بنابراین، میتوانید از در پایتون 3.2، روش جدیدی برای پیکربندی گزارشگیری معرفی شده است که در آن از دیکشنریها برای نگهداری اطلاعات پیکربندی استفاده میشود. این روش، ابرمجموعهای از قابلیتهای رویکرد مبتنی بر پرونده پیکربندیِ ذکرشده در بالا را فراهم میکند و روش پیکربندی توصیهشده برای برنامهها و استقرارهای جدید است. از آنجا که از یک دیکشنری پایتون برای نگهداری اطلاعات پیکربندی استفاده میشود، و از آنجا که میتوانید آن دیکشنری را با روشهای مختلفی پر کنید، گزینههای بیشتری برای پیکربندی دارید. برای مثال، میتوانید از یک پرونده پیکربندی در قالب JSON، یا در صورت دسترسی به قابلیت پردازش YAML، از یک پرونده در قالب YAML، برای پر کردن دیکشنری پیکربندی استفاده کنید. یا البته، میتوانید دیکشنری را در کد پایتون بسازید، آن را بهصورت pickled از طریق یک سوکت دریافت کنید، یا از هر رویکردی که برای برنامه شما مناسب است استفاده کنید. در اینجا نمونهای از همان پیکربندی بالا، در قالب YAML برای رویکرد جدید مبتنی بر دیکشنری آمده است: version: 1 formatters: simple: format: '%(asctime)s - %(name)s - %(levelname)s - %(message)s' handlers: console: class: logging.StreamHandler level: DEBUG formatter: simple stream: ext://sys.stdout loggers: simpleExample: level: DEBUG handlers: [console] propagate: no root: level: DEBUG handlers: [console] برای اطلاعات بیشتر دربارهی گزارشکردن با استفاده از یک دیکشنری، توابع پیکربندی را ببینید. اگر هیچ پیکربندی ارائه نشود، چه اتفاقی میافتد¶اگر هیچ پیکربندی گزارشگیری ارائه نشده باشد، ممکن است موقعیتی پیش بیاید که یک رویداد گزارشگیری نیاز به خروجی داشته باشد، اما هیچ هندلری برای خروجی آن رویداد نتوان یافت. این رویداد با استفاده از یک «هندلر آخرین چاره» (handler of last resort) که در تغییر یافته در نسخهی 3.2: در نسخههای پایتون پیش از 3.2، رفتار به شرح زیر است:
برای به دست آوردن رفتار پیش از 3.2، میتوان پیکربندی گزارش برای یک کتابخانه¶هنگام توسعهی کتابخانهای که از گزارشگیری استفاده میکند، باید دقت کنید که نحوهی استفادهی کتابخانه از گزارشگیری را مستند کنید، برای مثال، نام گزارشگیرهای استفادهشده. همچنین باید به پیکربندی گزارشگیری آن نیز توجه شود. اگر برنامهی استفادهکننده از گزارشگیری استفاده نکند و کد کتابخانه فراخوانیهای گزارشگیری انجام دهد، آنگاه (همانطور که در بخش قبلی توضیح داده شد) رویدادهایی با شدت اگر به هر دلیلی نمیخواهید این پیامها در نبود هرگونه پیکربندی گزارش چاپ شوند، میتوانید یک هندلر بیعمل را به گزارشگیر سطح بالای کتابخانهی خود متصل کنید. این کار از چاپ پیام جلوگیری میکند، زیرا همیشه برای رویدادهای کتابخانه یک هندلر پیدا خواهد شد: فقط هیچ خروجیای تولید نمیکند. اگر کاربر کتابخانه گزارش را برای استفادهی برنامه پیکربندی کند، احتمالاً آن پیکربندی چند هندلر اضافه خواهد کرد، و اگر سطوح بهطور مناسبی پیکربندی شده باشند، فراخوانیهای گزارش انجامشده در کد کتابخانه، خروجی را مانند حالت عادی به آن هندلرها ارسال خواهند کرد. یک هندلر بدون عملیات در بستهی logging گنجانده شده است: import logging logging.getLogger('foo').addHandler(logging.NullHandler()) باید اثر مطلوب را داشته باشد. اگر سازمانی تعدادی کتابخانه تولید کند، آنگاه نام گزارشگیر مشخصشده میتواند بهجای فقط 'foo'، 'orgname.foo' باشد. نکته اکیداً توصیه میشود که در کتابخانهی خود به گزارشگیر ریشه گزارش نکنید. در عوض، از گزارشگیری با نام یکتا و بهراحتی قابلتشخیص استفاده کنید، مانند نکته اکیداً توصیه میشود که هیچ هندلری بهجز سطوح گزارش¶مقادیر عددی سطوح گزارشگیری در جدول زیر آمده است. این مقادیر عمدتاً زمانی اهمیت دارند که بخواهید سطوح خودتان را تعریف کنید و لازم باشد که آنها مقادیر مشخصی نسبت به سطوح از پیش تعریفشده داشته باشند. اگر سطحی با همان مقدار عددی تعریف کنید، مقدار از پیش تعریفشده را بازنویسی میکند؛ نام از پیش تعریفشده از بین میرود.
سطحها میتوانند به گزارشگیرها نیز مرتبط باشند و توسط توسعهدهنده یا از طریق بارگذاری یک پیکربندی گزارشگیری ذخیرهشده تنظیم شوند. هنگامی که یک متد گزارشگیری روی یک گزارشگیر فراخوانی میشود، گزارشگیر سطح خود را با سطح مرتبط با فراخوانی متد مقایسه میکند. اگر سطح گزارشگیر بالاتر از سطح فراخوانی متد باشد، در عمل هیچ پیام گزارشگیریی تولید نمیشود. این مکانیزم اساسی کنترل پرگویی خروجی گزارشگیری است. پیامهای ثبت رویداد بهصورت نمونههایی از کلاس پیامهای گزارش با استفاده از handlers تحت یک سازوکار توزیع قرار میگیرند؛ هندلرها نمونههایی از زیرکلاسهای کلاس همانند گزارشگیرها، هندلرها نیز میتوانند سطحهایی مرتبط با خود داشته باشند. سطح یک هندلر نیز همانند سطح یک گزارشگیر بهعنوان یک فیلتر عمل میکند. اگر یک هندلر تصمیم بگیرد واقعاً رویدادی را ارسال کند، از متد سطوح سفارشی¶تعریف سطوح خودتان ممکن است، اما نباید ضروری باشد، زیرا سطوح موجود بر اساس تجربه عملی انتخاب شدهاند. با این حال، اگر متقاعد شدهاید که به سطوح سفارشی نیاز دارید، باید هنگام انجام این کار بسیار احتیاط کنید، و ممکن است تعریف سطوح سفارشی در صورتی که در حال توسعهی یک کتابخانه هستید، ایده بسیار بدی باشد. این به آن دلیل است که اگر چندین نویسنده کتابخانه همگی سطوح سفارشی خود را تعریف کنند، این احتمال وجود دارد که کنترل و/یا تفسیر خروجی گزارشگیری چنین کتابخانههایی که با هم استفاده میشوند، برای توسعهدهنده استفادهکننده دشوار باشد، زیرا یک مقدار عددی معین ممکن است برای کتابخانههای مختلف معانی متفاوتی داشته باشد. هندلرهای مفید¶علاوه بر کلاس پایه
اضافه شده در نسخهی 3.1: کلاس اضافه شده در نسخهی 3.2: کلاس کلاسهای پیامهای ثبتشده برای نمایش از طریق نمونههایی از کلاس برای قالببندی چندین پیام در یک دسته، میتوان از نمونههای هنگامی که فیلتر کردن بر اساس سطح logger و/یا سطح handler کافی نباشد، میتوان نمونههایی از قابلیت پایهای استثناهای پرتابشده هنگام گزارش کردن¶بستهی گزارشگیری بهگونهای طراحی شده است که استثناهایی را که هنگام گزارشگیری در محیط عملیاتی رخ میدهند، ببلعد. این برای آن است که خطاهایی که هنگام مدیریت رویدادهای گزارشگیری رخ میدهند — مانند پیکربندی نادرست گزارشگیری، خطاهای شبکه یا دیگر خطاهای مشابه — باعث خاتمهی زودهنگام برنامهی کاربردیای که از گزارشگیری استفاده میکند، نشوند. استثناهای پیادهسازی پیشفرض نکته مقدار پیشفرض استفاده از اشیاء دلخواه بهعنوان پیام¶در بخشها و مثالهای پیشین، فرض بر این بوده است که پیامی که هنگام ثبت رویداد ارسال میشود، یک رشته است. با این حال، این تنها حالت ممکن نیست. شما میتوانید یک شیء دلخواه را بهعنوان پیام ارسال کنید، و هنگامی که سیستم ثبت رویداد نیاز داشته باشد آن را به یک بازنمایی رشتهای تبدیل کند، متد بهینهسازی¶قالببندی آرگومانهای پیام تا زمانی که نتوان از آن اجتناب کرد، به تعویق میافتد. با این حال، محاسبه آرگومانهایی که به متد گزارشکردن ارسال میشوند نیز میتواند پرهزینه باشد، و ممکن است بخواهید از انجام آن اجتناب کنید اگر گزارشگیر قرار باشد صرفاً رویداد شما را دور بیندازد. برای تصمیمگیری درباره اینکه چه کاری انجام دهید، میتوانید متد if logger.isEnabledFor(logging.DEBUG): logger.debug('Message with %s, %s', expensive_func1(), expensive_func2()) بهگونهای که اگر آستانهی گزارشگیر بالاتر از نکته در برخی موارد، خود برای برنامههای کاربردی خاصی که به کنترل دقیقتری بر اطلاعات گزارش جمعآوریشده نیاز دارند، میتوان بهینهسازیهای دیگری نیز انجام داد. در اینجا فهرستی از کارهایی آمده است که میتوانید برای اجتناب از پردازشهایی که در حین گزارش کردن به آنها نیاز ندارید، انجام دهید:
همچنین توجه داشته باشید که ماژول اصلی logging فقط شامل هندلرهای پایه است. اگر منابع دیگر¶همچنین ببینید
© حق نشر 2001 Python Software Foundation.
این صفحه تحت مجوز بنیاد نرمافزار پایتون نسخه ۲ منتشر شده است. مثالها، دستورالعملها، و سایر کدهای موجود در مستندات همچنین تحت مجوز بدون بند BSD منتشر شدهاند. برای اطلاعات بیشتر به تاریخچه و مجوز مراجعه کنید. بنیاد نرمافزار پایتون یک شرکت غیرانتفاعی است. لطفاً کمک مالی کنید. آخرین بهروزرسانی در نوامبر 12, 2026 (06:19 UTC). آیا اشکالی یافتید؟ ساخته شده با Sphinx 9.1.0. | ||||||||||||||||||||||||||||||||||||||||||||||||||
| You are visitor 01402503 — GeezerVison does not store the pages you look up. Best viewed with Netscape Navigator 4.7 or Internet Explorer 6 at 800×600. No cookies required. |