logging.handlers --- هندلرهای گزارشگیری (Logging handlers)¶
کد منبع: Lib/logging/handlers.py
هندلرهای مفید زیر در این بسته ارائه شدهاند. توجه داشته باشید که سه مورد از هندلرها (StreamHandler، FileHandler و NullHandler) در واقع در خود ماژول logging تعریف شدهاند، اما در اینجا همراه با سایر هندلرها مستند شدهاند.
StreamHandler¶
کلاس StreamHandler، واقع در بستهی اصلی logging، خروجی ثبت گزارشگیری را به جریانهایی مانند sys.stdout، sys.stderr یا هر شیء شبهپرونده (یا، دقیقتر، هر شیءای که از متدهای write() و flush() پشتیبانی میکند) ارسال میکند.
- class logging.StreamHandler(stream=None)¶
یک نمونه جدید از کلاس
StreamHandlerبرمیگرداند. اگر stream مشخص شده باشد، نمونه از آن برای خروجی گزارش استفاده میکند؛ در غیر این صورت، از sys.stderr استفاده میشود.- emit(record)¶
اگر یک قالببند مشخص شده باشد، از آن برای قالببندی رکورد استفاده میشود. سپس رکورد در جریان نوشته میشود و پس از آن
terminatorمیآید. اگر اطلاعات استثنا وجود داشته باشد، با استفاده ازtraceback.print_exception()قالببندی میشود و به جریان افزوده میشود.
- flush()¶
جریان را با فراخوانی متد
flush()خود تخلیه میکند. توجه داشته باشید که متدclose()ازHandlerبه ارث برده شده است و بنابراین هیچ خروجی نمیدهد، از این رو گاهی ممکن است به یک فراخوانی صریحflush()نیاز باشد.
- setStream(stream)¶
جریان نمونه را، در صورت متفاوت بودن، روی مقدار مشخصشده تنظیم میکند. جریان پیشین پیش از تنظیم جریان جدید تخلیه میشود.
- پارامترها:
stream -- جریانی که هندلر باید از آن استفاده کند.
- بازگشت ها:
جریان قدیمی، اگر جریان تغییر کرده باشد، یا
Noneاگر تغییر نکرده باشد.
اضافه شده در نسخهی 3.7.
- terminator¶
رشتهای که بهعنوان پایانبند هنگام نوشتن یک رکورد قالببندیشده در یک جریان استفاده میشود. مقدار پیشفرض
'\n'است.اگر پایاندهی با خط جدید را نمیخواهید، میتوانید ویژگی
terminatorنمونهی هندلر را روی رشتهی خالی تنظیم کنید.در نسخههای پیشین، پایاندهنده بهصورت سختکد
'\n'بود.اضافه شده در نسخهی 3.2.
FileHandler¶
کلاس FileHandler که در بستهی اصلی logging قرار دارد، خروجی گزارشگیری را به یک پرونده روی دیسک ارسال میکند. این کلاس قابلیت خروجی را از StreamHandler به ارث میبرد.
- class logging.FileHandler(filename, mode='a', encoding=None, delay=False, errors=None)¶
نمونهای جدید از کلاس
FileHandlerبرمیگرداند. پرونده مشخصشده باز میشود و بهعنوان جریان گزارشگیری استفاده میشود. اگر mode مشخصنشده باشد، از'a'استفاده میشود. اگر encoding برابرNoneنباشد، از آن برای باز کردن پرونده با همان کدگذاری استفاده میشود. اگر delay درست باشد، باز شدن پرونده تا اولین فراخوانیemit()به تعویق میافتد. بهطور پیشفرض، پرونده بهطور نامحدود بزرگ میشود. اگر errors مشخصشده باشد، از آن برای تعیین نحوهی مدیریت خطاهای کدگذاری استفاده میشود.تغییر یافته در نسخهی 3.6: علاوه بر مقادیر رشتهای، اشیای
Pathنیز برای آرگومان filename پذیرفته میشوند.تغییر یافته در نسخهی 3.9: پارامتر errors افزوده شد.
- close()¶
پرونده را میبندد.
NullHandler¶
اضافه شده در نسخهی 3.1.
کلاس NullHandler، واقعشده در بستهی هستهی logging، هیچگونه قالببندی یا خروجی انجام نمیدهد. این کلاس در اصل یک هندلر عملیات بیاثر (no-op) برای استفاده توسعهدهندگان کتابخانه است.
- class logging.NullHandler¶
یک نمونه جدید از کلاس
NullHandlerبرمیگرداند.- emit(record)¶
این متد هیچ کاری انجام نمیدهد.
- handle(record)¶
این متد هیچ کاری انجام نمیدهد.
- createLock()¶
این متد برای قفل،
Noneرا بازمیگرداند، زیرا هیچ ورودی/خروجی زیربنایی وجود ندارد که دسترسی به آن نیاز به سریالسازی داشته باشد.
برای اطلاعات بیشتر درباره نحوه استفاده از NullHandler، پیکربندی گزارش برای یک کتابخانه را ببینید.
WatchedFileHandler¶
کلاس WatchedFileHandler که در ماژول logging.handlers قرار دارد، یک FileHandler است که پروندهای را که در آن گزارش میکند پایش میکند. اگر پرونده تغییر کند، بسته میشود و با استفاده از نام پرونده دوباره باز میشود.
ممکن است تغییری در یک پرونده به دلیل استفاده از برنامههایی مانند newsyslog و logrotate، که چرخش پروندههای گزارش را انجام میدهند، رخ دهد. این هندلر، که برای استفاده در Unix/Linux در نظر گرفته شده است، پرونده را پایش میکند تا ببیند آیا از آخرین ارسال (emit) تغییر کرده است یا خیر. (اگر دستگاه یا آینود پرونده تغییر کرده باشد، پرونده تغییر کرده تلقی میشود.) اگر پرونده تغییر کرده باشد، جریان پرونده قدیمی بسته میشود و پرونده برای دریافت یک جریان جدید باز میشود.
این هندلر برای استفاده در ویندوز مناسب نیست، زیرا در ویندوز پروندههای گزارش باز قابل جابهجایی یا تغییر نام نیستند — logging پروندهها را با قفلهای انحصاری باز میکند — و بنابراین نیازی به چنین هندلری نیست. علاوه بر این، ST_INO در ویندوز پشتیبانی نمیشود؛ stat() همیشه برای این مقدار ۰ برمیگرداند.
- class logging.handlers.WatchedFileHandler(filename, mode='a', encoding=None, delay=False, errors=None)¶
یک نمونه جدید از کلاس
WatchedFileHandlerبرمیگرداند. پرونده مشخصشده باز میشود و بهعنوان جریان برای ثبت گزارش استفاده میشود. اگر mode مشخص نباشد، از'a'استفاده میشود. اگر encoding برابرNoneنباشد، از آن برای باز کردن پرونده با همان کدگذاری استفاده میشود. اگر delay درست باشد، باز شدن پرونده تا اولین فراخوانیemit()به تعویق میافتد. بهطور پیشفرض، پرونده بدون محدودیت رشد میکند. اگر errors ارائه شده باشد، چگونگی مدیریت خطاهای کدگذاری را تعیین میکند.تغییر یافته در نسخهی 3.6: علاوه بر مقادیر رشتهای، اشیای
Pathنیز برای آرگومان filename پذیرفته میشوند.تغییر یافته در نسخهی 3.9: پارامتر errors افزوده شد.
- reopenIfNeeded()¶
بررسی میکند که آیا پرونده تغییر کرده است. اگر تغییر کرده باشد، جریان موجود تخلیه و بسته میشود و پرونده دوباره باز میشود، معمولاً بهعنوان پیشدرآمدی برای خروجی دادن رکورد به پرونده.
اضافه شده در نسخهی 3.6.
- emit(record)¶
رکورد را در پرونده خروجی میدهد، اما ابتدا
reopenIfNeeded()را فراخوانی میکند تا در صورت تغییر پرونده، آن را دوباره باز کند.
BaseRotatingHandler¶
کلاس BaseRotatingHandler، واقع در ماژول logging.handlers، کلاس پایه برای هندلرهای پرونده چرخشی (rotating file handlers)، RotatingFileHandler و TimedRotatingFileHandler است. شما نباید نیازی به نمونهسازی از این کلاس داشته باشید، اما این کلاس دارای ویژگیها و متدهایی است که ممکن است نیاز داشته باشید آنها را بازنویسی کنید.
- class logging.handlers.BaseRotatingHandler(filename, mode, encoding=None, delay=False, errors=None)¶
پارامترها مانند
FileHandlerهستند. ویژگیها عبارتند از:- namer¶
اگر این ویژگی روی یک شیء فراخوانیپذیر تنظیم شود، متد
rotation_filename()به این callable واگذار میشود. پارامترهای ارسالشده به این callable، همان پارامترهایی هستند که بهrotation_filename()ارسال شدهاند.توجه
تابع namer چندین بار در حین چرخش فراخوانی میشود، بنابراین باید تا حد ممکن ساده و سریع باشد. همچنین باید به ازای هر ورودی مشخص، هر بار یک خروجی یکسان برگرداند، در غیر این صورت ممکن است رفتار چرخش آنطور که انتظار میرود کار نکند.
همچنین لازم است توجه داشته باشید که هنگام استفاده از یک نامگذار (namer)، باید دقت کنید که برخی ویژگیهای خاص در نام پرونده که در حین چرخش استفاده میشوند، حفظ شوند. برای مثال،
RotatingFileHandlerانتظار دارد مجموعهای از پروندههای گزارش وجود داشته باشند که نامهایشان حاوی اعداد صحیح متوالی باشد، تا چرخش همانطور که انتظار میرود کار کند، وTimedRotatingFileHandlerپروندههای گزارش قدیمی را (بر اساس پارامترbackupCountکه به راهانداز handler ارسال میشود) با تعیین قدیمیترین پروندهها برای حذف، حذف میکند. برای این که این اتفاق بیفتد، نامهای پرونده باید با استفاده از بخش تاریخ/ساعتِ نام پرونده قابل مرتبسازی باشند، و یک نامگذار باید این موضوع را رعایت کند. (اگر بخواهید از یک نامگذار استفاده کنید که این طرحواره را رعایت نمیکند، لازم است آن را در یک زیرکلاس ازTimedRotatingFileHandlerبه کار ببرید که متدgetFilesToDelete()را برای هماهنگی با طرحواره نامگذاری سفارشی بازنویسی میکند.)اضافه شده در نسخهی 3.3.
- rotator¶
اگر این ویژگی به یک شیء فراخوانیپذیر تنظیم شود، متد
rotate()به این شیء فراخوانیپذیر واگذار میشود. پارامترهای ارسالشده به این شیء قابل فراخوانی، همان پارامترهای ارسالشده بهrotate()هستند.اضافه شده در نسخهی 3.3.
- rotation_filename(default_name)¶
هنگام چرخش، نام یک پرونده گزارش را تغییر دهید.
این فراهم شده است تا بتوانید یک نام پرونده سفارشی ارائه دهید.
پیادهسازی پیشفرض، ویژگی 'namer' از هندلر را فراخوانی میکند، مشروط بر اینکه فراخوانیپذیر باشد، و نام پیشفرض را به آن میدهد. اگر این ویژگی فراخوانیپذیر نباشد (پیشفرض
Noneاست)، نام بدون تغییر بازگردانده میشود.- پارامترها:
default_name -- نام پیشفرض برای پرونده گزارش.
اضافه شده در نسخهی 3.3.
- rotate(source, dest)¶
هنگام چرخش، گزارش فعلی را بچرخانید.
پیادهسازی پیشفرض، ویژگی 'rotator' هندلر را، در صورتی که قابل فراخوانی باشد، فراخوانی میکند و آرگومانهای source و dest را به آن میدهد. اگر این ویژگی فراخوانیپذیر نباشد (مقدار پیشفرض
Noneاست)، source بهسادگی به مقصد تغییر نام داده میشود.- پارامترها:
source -- نام پرونده منبع. این معمولاً نام پرونده پایه است، مثلاً 'test.log'.
dest -- نام پرونده مقصد. این معمولاً همان چیزی است که منبع به آن چرخش داده میشود، مثلاً 'test.log.1'.
اضافه شده در نسخهی 3.3.
دلیل وجود این ویژگیها این است که شما را از نیاز به زیرکلاسسازی (subclass) بینیاز کند؛ میتوانید از همان فراخوانیپذیرها برای نمونههای RotatingFileHandler و TimedRotatingFileHandler استفاده کنید. اگر هر یک از فراخوانیپذیرهای namer یا rotator استثنایی را پرتاب کند، این استثنا به همان شیوهای که هر استثنای دیگری در طول یک فراخوانی emit() مدیریت میشود، مدیریت خواهد شد، یعنی از طریق متد handleError() در هندلر .
اگر نیاز دارید تغییرات اساسیتری در پردازش چرخش ایجاد کنید، میتوانید متدها را بازنویسی کنید.
برای یک مثال، استفاده از چرخاننده (rotator) و نامگذار (namer) برای سفارشیسازی پردازش چرخش گزارش را ببینید.
RotatingFileHandler¶
کلاس RotatingFileHandler، که در ماژول logging.handlers قرار دارد، از چرخش پروندههای گزارش روی دیسک پشتیبانی میکند.
- class logging.handlers.RotatingFileHandler(filename, mode='a', maxBytes=0, backupCount=0, encoding=None, delay=False, errors=None)¶
یک نمونه جدید از کلاس
RotatingFileHandlerبرمیگرداند. پرونده مشخصشده باز میشود و بهعنوان جریان برای گزارشکردن استفاده میشود. اگر mode مشخصنشده باشد،'a'استفاده میشود. اگر encoding برابرNoneنباشد، از آن برای باز کردن پرونده با همان کدگذاری استفاده میشود. اگر delay درست باشد، باز کردن پرونده تا نخستین فراخوانیemit()به تعویق میافتد. بهطور پیشفرض، پرونده بهطور نامحدود رشد میکند. اگر errors ارائهشده باشد، چگونگی مدیریت خطاهای کدگذاری را تعیین میکند.شما میتوانید از مقدارهای maxBytes و backupCount استفاده کنید تا پرونده در اندازهای از پیش تعیینشده چرخش <rollover> کند. هنگامی که اندازهی پرونده در آستانهی بیشتر شدن از این اندازه باشد، پرونده بسته میشود و پرونده جدیدی بهصورت بیصدا برای خروجی باز میشود. چرخش هر زمان رخ میدهد که طول پرونده گزارش جاری نزدیک به maxBytes باشد؛ اما اگر هر یک از maxBytes یا backupCount صفر باشد، چرخش هرگز رخ نمیدهد، بنابراین معمولاً میخواهید backupCount را حداقل روی ۱ تنظیم کنید و maxBytes غیرصفر داشته باشید. هنگامی که backupCount غیرصفر باشد، سامانه فایلبندیهای گزارش قدیمی را با افزودن پسوندهای '.1'، '.2' و غیره به نام پرونده ذخیره میکند. برای مثال، با backupCount برابر ۵ و نام پایهی پرونده
app.log،app.log،app.log.1،app.log.2و بههمین ترتیب تاapp.log.5را خواهید داشت. پروندهای که در آن نوشته میشود همیشهapp.logاست. هنگامی که این پرونده پر شود، بسته میشود و بهapp.log.1تغییر نام مییابد، و اگر پروندههایapp.log.1،app.log.2و غیره وجود داشته باشند، بهترتیب بهapp.log.2،app.log.3و غیره تغییر نام مییابند.تغییر یافته در نسخهی 3.6: علاوه بر مقادیر رشتهای، اشیای
Pathنیز برای آرگومان filename پذیرفته میشوند.تغییر یافته در نسخهی 3.9: پارامتر errors افزوده شد.
- doRollover()¶
یک چرخش انجام میدهد، همانطور که در بالا توضیح داده شد.
- emit(record)¶
رکورد را در پرونده خروجی میدهد و چرخش را همانطور که پیشتر توضیح داده شد، مدیریت میکند.
- shouldRollover(record)¶
بررسی کنید که آیا رکورد ارائهشده باعث میشود پرونده از محدودیت اندازهی پیکربندیشده فراتر رود.
TimedRotatingFileHandler¶
کلاس TimedRotatingFileHandler، واقع در ماژول logging.handlers، از چرخش پروندههای گزارش روی دیسک در بازههای زمانی مشخص پشتیبانی میکند.
- class logging.handlers.TimedRotatingFileHandler(filename, when='h', interval=1, backupCount=0, encoding=None, delay=False, utc=False, atTime=None, errors=None)¶
یک نمونه جدید از کلاس
TimedRotatingFileHandlerبرمیگرداند. پرونده مشخصشده باز میشود و بهعنوان جریانبرای گزارشکردن استفاده میشود. هنگام چرخش، پسوند نام پرونده را نیز تنظیم میکند. چرخش بر اساس حاصلضرب when و interval رخ میدهد.میتوانید از when برای تعیین نوع interval استفاده کنید. فهرست مقادیر ممکن در زیر آمده است. توجه داشته باشید که آنها به بزرگی و کوچکی حروف حساس نیستند.
مقدار
نوع بازه
اینکه آیا/چگونه از atTime استفاده میشود
'S'ثانیهها
نادیده گرفته میشود
'M'دقیقهها
نادیده گرفته میشود
'H'ساعتها
نادیده گرفته میشود
'D'روزها
نادیده گرفته میشود
'W0'-'W6'روز هفته (۰=دوشنبه)
برای محاسبه زمان چرخش اولیه استفاده میشود
'midnight'اگر atTime مشخص نشده باشد، چرخش در نیمهشب انجام میشود، در غیر این صورت در زمان atTime انجام میشود
برای محاسبه زمان چرخش اولیه استفاده میشود
هنگام استفاده از چرخش مبتنی بر روز هفته، 'W0' را برای دوشنبه، 'W1' را برای سهشنبه، و به همین ترتیب تا 'W6' را برای یکشنبه مشخص کنید. در این حالت، مقدار ارسالشده برای interval استفاده نمیشود.
سامانه فایلبندیهای گزارش قدیمی را با افزودن پسوندها به نام پرونده ذخیره میکند. این پسوندها مبتنی بر تاریخ و زمان هستند و بسته به بازهی چرخش، از قالب strftime بهصورت
%Y-%m-%d_%H-%M-%Sیا بخش ابتدایی آن استفاده میکنند.هنگام محاسبهی زمان چرخش بعدی برای نخستین بار (هنگامی که هندلر ایجاد میشود)، از زمان آخرین تغییر پرونده گزارش موجود، و در غیر این صورت از زمان فعلی، برای محاسبهی زمان وقوع چرخش بعدی استفاده میشود.
اگر آرگومان utc درست باشد، از زمانهای UTC استفاده میشود؛ در غیر این صورت از زمان محلی استفاده میشود.
اگر backupCount غیرصفر باشد، حداکثر backupCount پرونده نگهداری خواهند شد، و اگر هنگام وقوع چرخش پروندههای بیشتری ایجاد شوند، قدیمیترین آنها حذف میشود. منطق حذف از بازه برای تعیین پروندههایی که باید حذف شوند استفاده میکند، بنابراین تغییر بازه ممکن است باعث باقی ماندن پروندههای قدیمی شود.
اگر delay مقدار true داشته باشد، باز شدن پرونده تا نخستین فراخوانی
emit()به تعویق میافتد.اگر atTime برابر
Noneنباشد، باید نمونهای ازdatetime.timeباشد که ساعتی از شبانهروز را که چرخش در آن رخ میدهد مشخص میکند، برای حالتهایی که چرخش برای وقوع در «نیمهشب» یا «یک روز خاص هفته» تنظیم شده است. توجه داشته باشید که در این حالتها، مقدار atTime عملاً برای محاسبهی چرخش اولیه استفاده میشود و چرخشهای بعدی از طریق محاسبهی بازهی معمول محاسبه خواهند شد.اگر errors مشخص شده باشد، از آن برای تعیین چگونگی مدیریت خطاهای کدگذاری استفاده میشود.
توجه
محاسبهی زمان چرخش اولیه هنگامی انجام میشود که هندلر مقداردهی اولیه میشود. محاسبهی زمانهای چرخش بعدی تنها زمانی انجام میشود که چرخش رخ دهد، و چرخش تنها زمانی رخ میدهد که خروجی منتشر شود. اگر این نکته را در نظر نداشته باشید، ممکن است کمی سردرگمی پیش بیاید. برای مثال، اگر بازهی «هر دقیقه» تنظیم شده باشد، به این معنا نیست که همیشه پروندههای گزارش با زمانهایی (در نام پرونده) خواهید دید که یک دقیقه از هم فاصله دارند؛ اگر در حین اجرای برنامه، خروجی گزارش بیش از یک بار در دقیقه تولید شود، آنگاه میتوانید انتظار داشته باشید پروندههای گزارش با زمانهایی که یک دقیقه از هم فاصله دارند ببینید. از سوی دیگر، اگر پیامهای گزارش تنها یک بار در هر ۵ دقیقه (مثلاً) منتشر شوند، در زمانهای پرونده فاصلههایی وجود خواهد داشت که متناظر با دقایقی هستند که هیچ خروجیای منتشر نشده (و در نتیجه هیچ چرخشی رخ نداده است).
تغییر یافته در نسخهی 3.4: پارامتر atTime افزوده شد.
تغییر یافته در نسخهی 3.6: علاوه بر مقادیر رشتهای، اشیای
Pathنیز برای آرگومان filename پذیرفته میشوند.تغییر یافته در نسخهی 3.9: پارامتر errors افزوده شد.
- doRollover()¶
یک چرخش انجام میدهد، همانطور که در بالا توضیح داده شد.
- emit(record)¶
رکورد را در پرونده مینویسد و چرخش را همانطور که در بالا توضیح داده شد، مدیریت میکند.
- getFilesToDelete()¶
فهرستی از نام پروندههایی را برمیگرداند که باید بهعنوان بخشی از چرخش حذف شوند. اینها مسیرهای مطلق قدیمیترین پروندههای گزارش پشتیبان هستند که توسط هندلر نوشته شدهاند.
- shouldRollover(record)¶
بررسی کنید که آیا زمان کافی برای وقوع یک چرخش سپری شده است یا خیر و اگر سپری شده است، زمان چرخش بعدی را محاسبه کنید.
SocketHandler¶
کلاس SocketHandler، که در ماژول logging.handlers قرار دارد، خروجی گزارشدهی را به یک سوکت شبکه ارسال میکند. کلاس پایه از یک سوکت TCP استفاده میکند.
- class logging.handlers.SocketHandler(host, port)¶
یک نمونه جدید از کلاس
SocketHandlerبرمیگرداند که برای ارتباط با یک ماشین راهدور با نشانی مشخصشده توسط host و port در نظر گرفته شده است.تغییر یافته در نسخهی 3.4: اگر
portبهصورتNoneمشخص شود، یک سوکت دامنهی Unix با استفاده از مقدارhostایجاد میشود؛ در غیر این صورت، یک سوکت TCP ایجاد میشود.- close()¶
سوکت را میبندد.
- emit()¶
دیکشنری ویژگیهای رکورد را پیکل میکند و آن را با قالب دودویی در سوکت مینویسد. اگر خطایی در سوکت رخ دهد، بسته را بهصورت بیصدا دور میاندازد. اگر اتصال پیشتر قطع شده باشد، اتصال را دوباره برقرار میکند. برای پیکلگشایی (unpickle) رکورد در سمت دریافتکننده به یک
LogRecord، از تابعmakeLogRecord()استفاده کنید.
- handleError()¶
خطایی را که در حین
emit()رخ داده است مدیریت میکند. محتملترین علت، از دست رفتن اتصال است. سوکت را میبندد تا بتوانیم در رویداد بعدی دوباره تلاش کنیم.
- makeSocket()¶
این یک متد کارخانهای است که به زیرکلاسها امکان میدهد نوع دقیق سوکت مورد نظر خود را تعریف کنند. پیادهسازی پیشفرض یک سوکت TCP ایجاد میکند (
socket.SOCK_STREAM).
- makePickle(record)¶
دیکشنری ویژگیهای رکورد را در قالب دودویی به همراه پیشوند طول، پیکل میکند و آن را آماده برای انتقال بر بستر سوکت برمیگرداند. جزئیات این عملیات معادل است با:
data = pickle.dumps(record_attr_dict, 1) datalen = struct.pack('>L', len(data)) return datalen + data
توجه داشته باشید که پیکلها کاملاً امن نیستند. اگر نگران امنیت هستید، شاید بخواهید این متد را بازنویسی کنید تا سازوکار امنتری پیادهسازی کنید. برای مثال، میتوانید پیکلها را با استفاده از HMAC امضا کنید و سپس صحت آنها را در سمت دریافتکننده تأیید کنید، یا بهعنوان جایگزین، میتوانید پیکلگشایی اشیاء سراسری را در سمت دریافتکننده غیرفعال کنید.
- send(packet)¶
یک بسته رشته بایتی پیکلشده را به سوکت ارسال کنید. قالب رشته بایتی ارسالشده همانگونه است که در مستندات
makePickle()توضیح داده شده است.این تابع امکان ارسالهای جزئی را فراهم میکند، که ممکن است هنگام مشغول بودن شبکه رخ دهد.
- createSocket()¶
تلاش میکند یک سوکت ایجاد کند؛ در صورت شکست، از یک الگوریتم پسروی نمایی (exponential back-off) استفاده میکند. در اولین شکست، هندلر پیامی را که سعی در ارسال آن داشت، رها میکند. هنگامی که پیامهای بعدی توسط همان نمونه رسیدگی شوند، تا مدتی سپری نشده باشد، برای برقراری اتصال تلاش نمیکند. پارامترهای پیشفرض بهگونهای هستند که تأخیر اولیه ۱ ثانیه است و اگر پس از آن تأخیر نیز اتصال برقرار نشد، هندلر هر بار تأخیر را دو برابر میکند، تا حداکثر ۳۰ ثانیه.
این رفتار با ویژگیهای زیرِ هندلر کنترل میشود:
retryStart(تأخیر اولیه، با مقدار پیشفرض ۱٫۰ ثانیه).retryFactor(ضریب، با مقدار پیشفرض 2.0).retryMax(حداکثر تأخیر، با مقدار پیشفرض ۳۰٫۰ ثانیه).
این بدان معناست که اگر شنونده راه دور (remote listener) پس از استفاده از هندلر راهاندازی شود، ممکن است پیامها را از دست بدهید (زیرا مدیر تا زمانی که تأخیر سپری نشود، حتی برای برقراری اتصال تلاش نمیکند، بلکه در طول بازه تأخیر، فقط پیامها را بیصدا دور میریزد).
DatagramHandler¶
کلاس DatagramHandler، واقع در ماژول logging.handlers، از SocketHandler ارث میبرد تا از ارسال پیامهای گزارش بر روی سوکتهای UDP پشتیبانی کند.
- class logging.handlers.DatagramHandler(host, port)¶
یک نمونه جدید از کلاس
DatagramHandlerبرمیگرداند که برای ارتباط با یک ماشین راهدور در نظر گرفته شده است و نشانی آن با host و port داده شده است.توجه
از آنجا که UDP پروتکل جریانی نیست، هیچ اتصال پایداری بین نمونهای از این هندلر و host وجود ندارد. به همین دلیل، هنگام استفاده از یک سوکت شبکه، ممکن است هر بار که رویدادی ثبت میشود، لازم باشد یک جستجوی DNS انجام شود؛ این موضوع میتواند مقداری تأخیر در سیستم ایجاد کند. اگر این مسئله بر شما تأثیر میگذارد، میتوانید خودتان یک جستجو انجام دهید و این هندلر را به جای نام میزبان، با استفاده از آدرس IP حاصل از جستجو راهاندازی کنید.
تغییر یافته در نسخهی 3.4: اگر
portبهصورتNoneتعیین شده باشد، یک سوکت دامنهی یونیکس با استفاده از مقدارhostایجاد میشود؛ در غیر این صورت، یک سوکت UDP ایجاد میشود.- emit()¶
دیکشنری ویژگیهای رکورد را پیکل میکند و آن را در قالب دودویی روی سوکت مینویسد. اگر خطایی در سوکت رخ دهد، بسته را بیصدا حذف میکند. برای خارج کردن رکورد از پیکل در سمت دریافتکننده به یک
LogRecord، از تابعmakeLogRecord()استفاده کنید.
- makeSocket()¶
در اینجا متد کارخانهای (factory method)
SocketHandlerبازنویسی شده است تا یک سوکت UDP (socket.SOCK_DGRAM) ایجاد کند.
- send(s)¶
یک رشته بایتی پیکلشده را به یک سوکت ارسال میکند. قالب رشته بایتی ارسالشده همانگونه است که در مستندات
SocketHandler.makePickle()توضیح داده شده است.
SysLogHandler¶
کلاس SysLogHandler، واقع در ماژول logging.handlers، از ارسال پیامهای گزارشدهی به syslog یونیکس دوردست یا محلی پشتیبانی میکند.
- class logging.handlers.SysLogHandler(address=('localhost', SYSLOG_UDP_PORT), facility=LOG_USER, socktype=socket.SOCK_DGRAM, timeout=None)¶
یک نمونهی جدید از کلاس
SysLogHandlerرا برمیگرداند که برای ارتباط با یک ماشین یونیکسی راهدور در نظر گرفته شده است و نشانی آن از طریق address در قالب یک تاپل(host, port)داده شده است. اگر address مشخص نشده باشد، از('localhost', 514)استفاده میشود. از این نشانی برای باز کردن یک سوکت استفاده میشود. جایگزینی برای ارائه یک تاپل(host, port)، ارائه یک نشانی بهصورت یک رشته است، برای مثال '/dev/log'. در این حالت، از یک سوکت دامنهی یونیکس برای ارسال پیام به syslog استفاده میشود. اگر facility مشخص نشده باشد، ازLOG_USERاستفاده میشود. نوع سوکتی که باز میشود به آرگومان socktype بستگی دارد، که مقدار پیشفرض آنsocket.SOCK_DGRAMاست و بنابراین یک سوکت UDP باز میشود. برای باز کردن یک سوکت TCP (برای استفاده با دیمنهای syslog جدیدتر مانند rsyslog)، مقدارsocket.SOCK_STREAMرا مشخص کنید. اگر timeout مشخص شده باشد، یک مهلت (بر حسب ثانیه) برای عملیات سوکت تنظیم میشود. این کار میتواند به جلوگیری از آویزان شدن برنامه بهطور نامحدود در صورت غیرقابلدسترس بودن سرور syslog کمک کند. بهطور پیشفرض، timeout برابرNoneاست، به این معنا که هیچ مهلتی اعمال نمیشود.توجه داشته باشید که اگر سرور شما به پورت UDP ۵۱۴ گوش نمیدهد،
SysLogHandlerممکن است به نظر برسد که کار نمیکند. در آن صورت، بررسی کنید که باید از چه نشانیای برای سوکت دامنه (domain socket) استفاده کنید — این موضوع وابسته به سیستم است. برای مثال، در لینوکس این نشانی معمولاً '/dev/log' است، اما در OS/X برابر '/var/run/syslog' است. باید پلتفرم خود را بررسی کنید و از نشانی مناسب استفاده کنید (اگر برنامه شما باید روی چندین پلتفرم اجرا شود، ممکن است لازم باشد این بررسی را در رانتایم انجام دهید). در ویندوز، عملاً باید از گزینه UDP استفاده کنید.توجه
در macOS 12.x (Monterey)، اپل رفتار syslog daemon خود را تغییر داده است؛ این سرویس دیگر روی یک سوکت دامنه (domain socket) گوش نمیدهد. بنابراین، نمیتوانید انتظار داشته باشید که
SysLogHandlerروی این سیستم کار کند.برای اطلاعات بیشتر gh-91070 را ببینید.
تغییر یافته در نسخهی 3.2: socktype افزوده شد.
تغییر یافته در نسخهی 3.14: timeout اضافه شد.
- close()¶
سوکت به میزبان راه دور را میبندد.
- createSocket()¶
سعی میکند یک سوکت ایجاد کند و اگر سوکت دیتاگرام نباشد، آن را به طرف مقابل متصل کند. این متد در هنگام مقداردهی اولیهی هندلر فراخوانی میشود، اما اگر طرف مقابل در این مرحله شنونده نباشد، خطا محسوب نمیشود؛ اگر در آن مرحله سوکتی وجود نداشته باشد، این متد هنگام انتشار یک رویداد دوباره فراخوانی خواهد شد.
اضافه شده در نسخهی 3.11.
- emit(record)¶
رکورد قالببندی میشود و سپس به سرور syslog ارسال میگردد. اگر اطلاعات استثنا موجود باشد، به سرور ارسال نمیشود.
تغییر یافته در نسخهی 3.2.1: (نگاه کنید به bpo-12168.) در نسخههای پیشین، پیام ارسالشده به دِیمِنهای syslog همیشه با یک بایت NUL ختم میشد، زیرا نسخههای اولیه این دِیمِنها انتظار داشتند پیام با NUL ختم شود — هرچند این موضوع در مشخصات مربوطه (RFC 5424) وجود ندارد. نسخههای جدیدتر این دِیمِنها انتظار بایت NUL را ندارند، اما اگر وجود داشته باشد آن را حذف میکنند، و دِیمِنهای حتی جدیدتر (که RFC 5424 را دقیقتر رعایت میکنند) بایت NUL را بهعنوان بخشی از پیام منتقل میکنند.
برای آسانتر کردن مدیریت پیامهای syslog در برابر همهی این رفتارهای متفاوت دِیمِنها (daemon)، افزودن بایت NUL از طریق استفاده از یک ویژگی در سطح کلاس،
append_nul، قابلپیکربندی شده است. این ویژگی بهطور پیشفرضTrueاست (با حفظ رفتار موجود) اما میتوان آن را در یک نمونهSysLogHandlerرویFalseتنظیم کرد تا آن نمونه پایانکنندهی NUL را اضافه نکند.تغییر یافته در نسخهی 3.3: (رجوع کنید: bpo-12419.) در نسخههای پیشین، امکانی برای پیشوند «ident» یا «tag» جهت شناسایی منبع پیام وجود نداشت. اکنون میتوان این پیشوند را با استفاده از یک ویژگی سطح کلاس مشخص کرد، که بهطور پیشفرض
""است تا رفتار موجود حفظ شود، اما میتوان این ویژگی را در یک نمونهSysLogHandlerبازنویسی کرد تا آن نمونه ident را به ابتدای هر پیام پردازششده اضافه کند. توجه داشته باشید که ident ارائهشده باید متن باشد، نه بایت، و دقیقاً همانطور که هست به ابتدای پیام اضافه میشود.
- encodePriority(facility, priority)¶
امکانات (facility) و اولویت (priority) را بهصورت یک عدد صحیح کدگذاری میکند. شما میتوانید رشتهها یا اعداد صحیح را ارسال کنید؛ اگر رشتهها ارسال شوند، از دیکشنریهای نگاشت داخلی برای تبدیل آنها به اعداد صحیح استفاده میشود.
مقادیر نمادین
LOG_درSysLogHandlerتعریف شدهاند و با مقادیر تعریفشده در پروندهی سرآیندsys/syslog.hمطابقت دارند.اولویتها
نام (رشته)
مقدار نمادین
alertLOG_ALERT
critیاcriticalLOG_CRIT
debugLOG_DEBUG
emergیاpanicLOG_EMERG
errیاerrorLOG_ERR
infoLOG_INFO
noticeLOG_NOTICE
warnیاwarningLOG_WARNING
امکانات
نام (رشته)
مقدار نمادین
authLOG_AUTH
authprivLOG_AUTHPRIV
cronLOG_CRON
daemonLOG_DAEMON
ftpLOG_FTP
kernLOG_KERN
lprLOG_LPR
mailLOG_MAIL
newsLOG_NEWS
syslogLOG_SYSLOG
userLOG_USER
uucpLOG_UUCP
local0LOG_LOCAL0
local1LOG_LOCAL1
local2LOG_LOCAL2
local3LOG_LOCAL3
local4LOG_LOCAL4
local5LOG_LOCAL5
local6LOG_LOCAL6
local7LOG_LOCAL7
- mapPriority(levelname)¶
یک نام سطح گزارش (logging level) را به یک نام اولویت syslog نگاشت میکند. ممکن است لازم باشد اگر از سطحهای سفارشی استفاده میکنید، یا اگر الگوریتم پیشفرض برای نیازهای شما مناسب نیست، این را بازنویسی کنید. الگوریتم پیشفرض،
DEBUG،INFO،WARNING،ERRORوCRITICALرا به نامهای معادل syslog و تمام نامهای سطح دیگر را به 'warning' نگاشت میکند.
NTEventLogHandler¶
کلاس NTEventLogHandler، واقع در ماژول logging.handlers، از ارسال پیامهای گزارش به گزارش رویداد محلی Windows NT، Windows 2000 یا Windows XP پشتیبانی میکند. پیش از آنکه بتوانید از آن استفاده کنید، باید افزونههای Win32 Mark Hammond برای Python نصب شده باشند.
- class logging.handlers.NTEventLogHandler(appname, dllname=None, logtype='Application')¶
یک نمونه جدید از کلاس
NTEventLogHandlerبرمیگرداند. appname برای تعریف نام برنامه، آنگونه که در گزارش رویداد ظاهر میشود، استفاده میشود. یک ورودی رجیستری مناسب با استفاده از این نام ایجاد میشود. dllname باید مسیر کامل یک .dll یا .exeای باشد که حاوی تعریف پیامهایی است که در گزارش نگهداری میشوند (اگر مشخص نشود،'win32service.pyd'استفاده میشود؛ این مورد همراه با افزونههای Win32 نصب میشود و حاوی چند تعریف پیام پایهی جاینگهدار است. توجه داشته باشید که استفاده از این جاینگهدارها باعث بزرگ شدن گزارشهای رویداد شما میشود، زیرا کل منبع پیام در گزارش نگهداری میشود. اگر گزارشهای کمحجمتر میخواهید، باید نام .dll یا .exe خودتان را که حاوی تعریف پیامهایی است که میخواهید در گزارش رویداد استفاده کنید، ارسال کنید). logtype یکی از'Application'،'System'یا'Security'است و مقدار پیشفرض آن'Application'است.- close()¶
در این مرحله، میتوانید نام برنامه را بهعنوان منبع ورودیهای گزارش رویداد از رجیستری حذف کنید. با این حال، اگر این کار را انجام دهید، نمیتوانید رویدادها را آنگونه که قصد داشتید در نمایشگر Event Log ببینید — این نمایشگر باید بتواند برای دریافت نام .dll به رجیستری دسترسی داشته باشد. نسخه فعلی این کار را انجام نمیدهد.
- emit(record)¶
شناسهی پیام، دسته رویداد و نوع رویداد را تعیین میکند و سپس پیام را در گزارش رویداد NT ثبت میکند.
- getEventCategory(record)¶
دسته رویداد برای رکورد را بازمیگرداند. اگر میخواهید دستهبندیهای خودتان را مشخص کنید، این متد را بازنویسی کنید. این نسخه ۰ را بازمیگرداند.
- getEventType(record)¶
نوع رویداد را برای رکورد برمیگرداند. اگر میخواهید نوعهای خودتان را مشخص کنید، این متد را بازنویسی کنید. این نسخه با استفاده از ویژگی typemap هندلر یک نگاشت انجام میدهد، که در
__init__()به دیکشنریای تنظیم میشود که شامل نگاشتهایی برایDEBUG،INFO،WARNING،ERRORوCRITICALاست. اگر از سطحهای خودتان استفاده میکنید، یا باید این متد را بازنویسی کنید یا یک دیکشنری مناسب در ویژگی typemap هندلر قرار دهید.
- getMessageID(record)¶
شناسه پیام رکورد را برمیگرداند. اگر از پیامهای خودتان استفاده میکنید، میتوانید این کار را به این صورت انجام دهید که msg ارسالشده به گزارشگیر یک شناسه باشد، نه یک رشته قالب. سپس، در اینجا میتوانید از یک جستجو در دیکشنری برای دریافت شناسه پیام استفاده کنید. این نسخه ۱ را برمیگرداند که شناسه پیام پایه در
win32service.pydاست.
SMTPHandler¶
کلاس SMTPHandler، که در ماژول logging.handlers قرار دارد، از ارسال پیامهای گزارش به یک نشانی ایمیل از طریق SMTP پشتیبانی میکند.
- class logging.handlers.SMTPHandler(mailhost, fromaddr, toaddrs, subject, credentials=None, secure=None, timeout=1.0)¶
یک نمونه جدید از کلاس
SMTPHandlerبرمیگرداند. این نمونه با آدرسهای فرستنده و گیرنده و خط موضوع ایمیل مقداردهی اولیه میشود. toaddrs باید فهرستی از رشتهها باشد. برای مشخص کردن یک پورت SMTP غیراستاندارد، از قالب تاپلبهشکل (host, port) برای آرگومان mailhost استفاده کنید. اگر از یک رشته استفاده کنید، از پورت استاندارد SMTP استفاده میشود. اگر سرور SMTP شما به احراز هویت نیاز دارد، میتوانید یک تاپلبهشکل (username, password) برای آرگومان credentials مشخص کنید.برای مشخص کردن استفاده از یک پروتکل امن (TLS)، یک تاپل را به آرگومان secure ارسال کنید. این مورد تنها زمانی استفاده میشود که اعتبارنامههای احراز هویت ارائه شده باشند. این تاپل باید یا تاپلی خالی باشد، یا تاپلی تکمقداری شامل نام پرونده کلید، یا تاپلی با ۲ مقدار شامل نامهای پرونده کلید و پرونده گواهی باشد. (این تاپل به متد
smtplib.SMTP.starttls()ارسال میشود.)میتوان برای ارتباط با سرور SMTP، یک مهلت زمانی را با استفاده از آرگومان timeout تعیین کرد.
تغییر یافته در نسخهی 3.3: پارامتر timeout افزوده شد.
- emit(record)¶
رکورد را قالببندی میکند و آن را به گیرندگان مشخصشده میفرستد.
- getSubject(record)¶
اگر میخواهید یک ردیف موضوع وابسته به رکورد را مشخص کنید، این متد را بازنویسی کنید.
MemoryHandler¶
کلاس MemoryHandler، که در ماژول logging.handlers قرار دارد، از بافر کردن رکوردهای گزارش در حافظه پشتیبانی میکند و آنها را بهصورت دورهای به یک هندلر target تخلیه میکند. تخلیه هر زمان که بافر پر باشد، یا زمانی که رویدادی با شدت معین یا بیشتر مشاهده شود، رخ میدهد.
MemoryHandler زیرکلاسی از BufferingHandler است که کلاسی کلیتر و انتزاعی میباشد. این کلاس رکوردهای گزارشدهی را در حافظه بافر میکند. هر بار که رکوردی به بافر اضافه میشود، با فراخوانی shouldFlush() بررسی میشود که آیا بافر باید تخلیه شود یا خیر. اگر باید تخلیه شود، انتظار میرود flush() تخلیه را انجام دهد.
- class logging.handlers.BufferingHandler(capacity)¶
هندلر را با بافری با ظرفیت مشخص، مقداردهی اولیه میکند. در اینجا، capacity به معنای تعداد رکوردهای گزارش (logging records) نگهداریشده در بافر است.
- emit(record)¶
رکورد را به بافر اضافه کنید. اگر
shouldFlush()مقدار true را برگرداند، برای پردازش بافرflush()را فراخوانی کنید.
- flush()¶
برای یک نمونه از
BufferingHandler، تخلیه به این معناست که بافر روی یک فهرست خالی تنظیم شود. میتوان این متد را بازنویسی کرد تا رفتار تخلیهی مفیدتری پیادهسازی شود.
- shouldFlush(record)¶
اگر بافر به ظرفیت خود رسیده باشد،
Trueرا برمیگرداند. این متد میتواند برای پیادهسازی راهبردهای سفارشی تخلیه بازنویسی شود.
- class logging.handlers.MemoryHandler(capacity, flushLevel=ERROR, target=None, flushOnClose=True)¶
نمونهای جدید از کلاس
MemoryHandlerبرمیگرداند. این نمونه با اندازه بافر capacity (تعداد رکوردهای نگهداریشده در بافر) مقداردهی اولیه میشود. اگر flushLevel مشخص نشده باشد، ازERRORاستفاده میشود. اگر target مشخص نشده باشد، پیش از آنکه این هندلر کار مفیدی انجام دهد، باید هدف با استفاده ازsetTarget()تنظیم شود. اگر flushOnClose بهصورتFalseمشخص شده باشد، آنگاه بافر هنگام بستن هندلر تخلیه نمیشود. اگر مشخص نشده باشد یا بهصورتTrueمشخص شده باشد، رفتار پیشین یعنی تخلیه بافر هنگام بستن هندلر رخ خواهد داد.تغییر یافته در نسخهی 3.6: پارامتر flushOnClose افزوده شد.
- flush()¶
برای یک نمونه از
MemoryHandler، تخلیه صرفاً به معنای ارسال رکوردهای بافرشده به هدف است، اگر هدفی وجود داشته باشد. همچنین هنگامی که رکوردهای بافرشده به هدف ارسال میشوند، بافر نیز پاک میشود. در صورتی که رفتار متفاوتی میخواهید، این متد را بازنویسی کنید.
- setTarget(target)¶
هندلر هدف را برای این هندلر تنظیم میکند.
- shouldFlush(record)¶
پر بودن بافر یا وجود یک رکورد در flushLevel یا بالاتر را بررسی میکند.
HTTPHandler¶
کلاس HTTPHandler، که در ماژول logging.handlers قرار دارد، از ارسال پیامهای گزارش به یک وبسرور با استفاده از معنای GET یا POST پشتیبانی میکند.
- class logging.handlers.HTTPHandler(host, url, method='GET', secure=False, credentials=None, context=None)¶
یک نمونه جدید از کلاس
HTTPHandlerبرمیگرداند. host میتواند به شکلhost:portباشد، در صورتی که بخواهید از شماره پورت خاصی استفاده کنید. اگر method مشخص نشده باشد،GETاستفاده میشود. اگر secure درست باشد، از اتصال HTTPS استفاده خواهد شد. پارامتر context میتواند به یک نمونه ازssl.SSLContextتنظیم شود تا تنظیمات SSL مورد استفاده برای اتصال HTTPS پیکربندی شود. اگر credentials مشخص شده باشد، باید یک تاپل دوتایی شامل شناسه کاربری و گذرواژه باشد که در سرآیند HTTP 'Authorization' با استفاده از احراز هویت Basic قرار میگیرد. اگر credentials را مشخص کنید، باید secure=True را نیز مشخص کنید تا شناسه کاربری و گذرواژه شما بهصورت متن آشکار در شبکه ارسال نشوند.تغییر یافته در نسخهی 3.5: پارامتر context افزوده شد.
- mapLogRecord(record)¶
دیکشنریای بر اساس
recordفراهم میکند که باید کدگذاری URL (URL-encoded) شود و به سرور وب فرستاده شود. پیادهسازی پیشفرض فقطrecord.__dict__را برمیگرداند. این متد را میتوان بازنویسی کرد، اگر برای مثال قرار باشد تنها زیرمجموعهای ازLogRecordبه سرور وب فرستاده شود، یا اگر سفارشیسازی خاصتری برای آنچه به سرور فرستاده میشود لازم باشد.
- emit(record)¶
رکورد را بهعنوان یک دیکشنری کدگذاریشده بهصورت URL به وبسرور ارسال میکند. از متد
mapLogRecord()برای تبدیل رکورد به دیکشنری ارسالی استفاده میشود.
توجه
از آنجا که آمادهسازی یک رکورد برای ارسال آن به یک وبسرور، با یک عملیات قالببندی عام یکسان نیست، استفاده از
setFormatter()برای تعیین یکFormatterبرایHTTPHandlerهیچ تأثیری ندارد. این هندلر بهجای فراخوانیformat()، ابتداmapLogRecord()و سپسurllib.parse.urlencode()را فراخوانی میکند تا دیکشنری را به شکلی مناسب برای ارسال به یک وبسرور کدگذاری کند.
QueueHandler¶
اضافه شده در نسخهی 3.2.
کلاس QueueHandler، واقع در ماژول logging.handlers، از ارسال پیامهای گزارش به یک صف پشتیبانی میکند، مانند آنهایی که در ماژولهای queue یا multiprocessing پیادهسازی شدهاند.
در کنار کلاس QueueListener، میتوان از QueueHandler استفاده کرد تا هندلرها کار خود را روی نخ جداگانهای از نخی که ثبت گزارش را انجام میدهد، انجام دهند. این موضوع در برنامههای وب و همچنین سایر برنامههای خدماتی اهمیت دارد؛ جایی که نخهای خدماتدهنده به کلاینتها باید تا حد ممکن سریع پاسخ دهند، در حالی که هرگونه عملیات بالقوه کند (مانند ارسال ایمیل از طریق SMTPHandler) روی نخ جداگانهای انجام میشود.
- class logging.handlers.QueueHandler(queue)¶
یک نمونه جدید از کلاس
QueueHandlerبرمیگرداند. این نمونه با صفی برای ارسال پیامها به آن مقداردهی اولیه میشود. queue میتواند هر شیء صفمانند باشد؛ این شیء همانطور که هست توسط متدenqueue()استفاده میشود، که باید بداند چگونه پیامها را به آن ارسال کند. داشتن API پیگیری وظیفه برای صف الزامی نیست، که به این معناست که میتوانید از نمونههایSimpleQueueبرای queue استفاده کنید.توجه
اگر از
multiprocessingاستفاده میکنید، باید از بهکارگیریSimpleQueueخودداری کنید و بهجای آن ازmultiprocessing.Queueاستفاده کنید.هشدار
ماژول
multiprocessingاز یک گزارشگیر داخلی استفاده میکند که از طریقget_logger()ایجاد و به آن دسترسی پیدا میشود.multiprocessing.Queueهنگام قرار گرفتن آیتمها در صف، پیامهایی در سطحDEBUGثبت میکند. اگر آن پیامهای گزارش توسط یکQueueHandlerبا استفاده از همان نمونهmultiprocessing.Queueپردازش شوند، باعث بنبست یا بازگشت بینهایت خواهد شد.- emit(record)¶
نتیجهی آمادهسازی LogRecord را در صف قرار میدهد. در صورت بروز استثنا (مثلاً به این دلیل که یک صف محدود پر شده باشد)، متد
handleError()برای رسیدگی به خطا فراخوانی میشود. این میتواند منجر به حذف بیصدای رکورد (اگرlogging.raiseExceptionsبرابرFalseباشد) یا چاپ یک پیام درsys.stderr(اگرlogging.raiseExceptionsبرابرTrueباشد) شود.
- prepare(record)¶
یک رکورد را برای قرارگیری در صف آماده میکند. شیء برگرداندهشده توسط این متد در صف قرار میگیرد.
پیادهسازی پایه، رکورد را قالببندی میکند تا پیام، آرگومانها، استثنا و اطلاعات پشته را در صورت وجود ادغام کند. همچنین آیتمهای غیرقابل پیکل را بهصورت درجا از رکورد حذف میکند. بهطور مشخص، ویژگیهای
msgوmessageرکورد را با پیام ادغامشده (که با فراخوانی متدformat()هندلر به دست میآید) بازنویسی میکند و ویژگیهایargs،exc_infoوexc_textرا رویNoneتنظیم میکند.ممکن است بخواهید این متد را بازنویسی کنید اگر میخواهید رکورد را به یک دیکشنری یا رشته JSON تبدیل کنید، یا در حالی که رکورد اصلی دستنخورده باقی میماند، یک کپی اصلاحشده از رکورد ارسال کنید.
توجه
پیادهسازی پایه، پیام را با آرگومانها قالببندی میکند، ویژگیهای
messageوmsgرا روی پیام قالببندیشده تنظیم میکند و ویژگیهایargsوexc_textرا رویNoneتنظیم میکند تا امکان پیکلکردن فراهم شود و از تلاشهای بعدی برای قالببندی جلوگیری شود. این بدان معناست که یک هندلر در سمتQueueListenerاطلاعات لازم برای انجام قالببندی سفارشی، برای مثال قالببندی استثناها، را نخواهد داشت. ممکن است بخواهید یک زیرکلاس ازQueueHandlerبسازید و این متد را بازنویسی کنید تا برای مثال از تنظیمexc_textرویNoneخودداری کنید. توجه داشته باشید که تغییراتmessage/msg/argsبه اطمینان از قابل پیکلکردن (pickleable) بودن رکورد مربوط است و ممکن است بتوانید یا نتوانید از انجام آن خودداری کنید، بسته به اینکهargsشما قابل پیکلکردن (pickleable) باشند یا خیر. (توجه داشته باشید که ممکن است لازم باشد نهتنها کد خودتان، بلکه کد موجود در هر کتابخانهای که استفاده میکنید را نیز در نظر بگیرید.)
- enqueue(record)¶
رکورد را با استفاده از
put_nowait()در صف قرار میدهد؛ اگر بخواهید از رفتار مسدودکننده، مهلت زمانی یا پیادهسازی صف سفارشی استفاده کنید، ممکن است بخواهید این را بازنویسی کنید.
- listener¶
هنگامی که از طریق پیکربندی با استفاده از
dictConfig()ایجاد شود، این ویژگی شامل یک نمونه ازQueueListenerبرای استفاده با این هندلر خواهد بود. در غیر این صورت،Noneخواهد بود.اضافه شده در نسخهی 3.12.
QueueListener¶
اضافه شده در نسخهی 3.2.
کلاس QueueListener، که در ماژول logging.handlers قرار دارد، از دریافت پیامهای گزارش از یک صف، مانند صفهای پیادهسازیشده در ماژولهای queue یا multiprocessing، پشتیبانی میکند. پیامها از یک صف در یک نخ داخلی دریافت میشوند و در همان نخ، برای پردازش به یک یا چند هندلر ارسال میشوند. اگرچه QueueListener خود یک هندلر نیست، اما در اینجا مستند شده است زیرا با QueueHandler همکاری نزدیکی دارد.
همراه با کلاس QueueHandler، میتوان از QueueListener استفاده کرد تا هندلرها کار خود را روی نخی جداگانه از نخی که ثبت وقایع را انجام میدهد، انجام دهند. این موضوع در برنامههای کاربردی وب و نیز سایر برنامههای کاربردی خدماتی اهمیت دارد، جایی که نخهای خدمترسان به کلاینتها باید تا حد ممکن بهسرعت پاسخ دهند، در حالی که هر عملیاتی که ممکن است کند باشد (مانند ارسال ایمیل از طریق SMTPHandler) روی نخی جداگانه انجام میشود.
- class logging.handlers.QueueListener(queue, *handlers, respect_handler_level=False)¶
یک نمونه جدید از کلاس
QueueListenerبرمیگرداند. این نمونه با صفی برای ارسال پیامها به آن و فهرستی از هندلرها مقداردهی اولیه میشود که ورودیهای قرار گرفته در صف را پردازش میکنند. صف میتواند هر شیء صفمانند باشد؛ این صف همانگونه که هست به متدdequeue()ارسال میشود و این متد باید بداند چگونه پیامها را از آن دریافت کند. داشتن API پیگیری وظایف برای صف الزامی نیست (هرچند در صورت موجود بودن از آن استفاده میشود)، به این معنا که میتوانید از نمونههایSimpleQueueبرای queue استفاده کنید.توجه
اگر از
multiprocessingاستفاده میکنید، باید از بهکارگیریSimpleQueueخودداری کنید و بهجای آن ازmultiprocessing.Queueاستفاده کنید.اگر
respect_handler_levelبرابرTrueباشد، هنگام تصمیمگیری برای ارسال پیامها به یک هندلر، سطح آن هندلر رعایت میشود (با سطح پیام مقایسه میشود)؛ در غیر این صورت، رفتار مانند نسخههای پیشین پایتون است — همیشه هر پیام به هر هندلر ارسال میشود.تغییر یافته در نسخهی 3.5: آرگومان
respect_handler_levelاضافه شد.تغییر یافته در نسخهی 3.14: اکنون میتوان از
QueueListenerبهعنوان یک مدیر زمینه از طریقwithاستفاده کرد. هنگام ورود به زمینه، شنونده آغاز میشود. هنگام خروج از زمینه، شنونده متوقف میشود.__enter__()شیءQueueListenerرا برمیگرداند.- dequeue(block)¶
یک رکورد را از صف خارج میکند و آن را برمیگرداند؛ بهصورت اختیاری مسدودکننده است.
پیادهسازی پایه از
get()استفاده میکند. اگر میخواهید از مهلتهای زمانی استفاده کنید یا با پیادهسازیهای سفارشی صف کار کنید، ممکن است بخواهید این متد را بازنویسی کنید.
- prepare(record)¶
یک رکورد را برای پردازش آماده کنید.
این پیادهسازی فقط رکورد ورودی را برمیگرداند. اگر نیاز دارید پیش از ارسال رکورد به هندلرها، هرگونه مارشالینگ یا دستکاری سفارشی روی آن انجام دهید، ممکن است بخواهید این متد را بازنویسی کنید.
- handle(record)¶
یک رکورد را مدیریت کنید.
این کار صرفاً روی هندلرها حلقه میزند و رکورد را برای پردازش به آنها پیشنهاد میدهد. شیء واقعی ارسالشده به هندلرها ، همان چیزی است که از
prepare()بازگشت داده میشود.
- start()¶
شنونده را آغاز میکند.
این یک نخ پسزمینه را راهاندازی میکند تا صف را برای LogRecordهایی که باید پردازش شوند، پایش کند.
تغییر یافته در نسخهی 3.14: اگر فراخوانی شود و شنونده از قبل در حال اجرا باشد،
RuntimeErrorپرتاب میشود.
- stop()¶
شنونده را متوقف میکند.
این از نخ درخواست میکند که خاتمه یابد، و سپس منتظر میماند تا این کار انجام شود. توجه داشته باشید که اگر پیش از خروج برنامهتان این را فراخوانی نکنید، ممکن است برخی رکوردها همچنان در صف باقی مانده باشند و پردازش نخواهند شد.
- enqueue_sentinel()¶
یک نشانه (sentinel) را در صف مینویسد تا به شنونده بگوید که خارج شود. این پیادهسازی از
put_nowait()استفاده میکند. اگر بخواهید از مهلتها استفاده کنید یا با پیادهسازیهای سفارشی صف کار کنید، ممکن است بخواهید این متد را بازنویسی کنید.اضافه شده در نسخهی 3.3.
همچنین ملاحظه نمائید
- ماژول
logging مرجع API ماژول logging.
- ماژول
logging.config API پیکربندی ماژول logging.