استفاده از handlers

  • مدرس: علی بیگدلی
  • تاریخ انتشار: 1402/05/04
  • تعداد بازدید: 180

تصور کنید زمانی را که می خواهید یک logger شخصی سازی شده را برای برنامه تنظیم و به نقاط مختلف کد ارسال کنید. handlers پیام های logging را به مقصد پیکربندی شده مانند جریان خروجی استاندارد یا یک پرونده یا از طریق HTTP یا از طریق SMTP به ایمیل شما ارسال می کنند.

logger ای که ایجاد می کنید می تواند بیش از یک کنترل کننده داشته باشد ، به این معنی که می توانید آن را تنظیم کنید تا در یک پرونده logging  ذخیره شود و همچنین آن را از طریق ایمیل ارسال کنید.

مانند لاگرها ، می توانید میزان level را در کنترل کننده ها نیز تنظیم کنید. این کار در صورتی مفید است که بخواهید چندین کنترل کننده را برای یک logger تنظیم کنید اما برای هر یک از آنها شدتهای مختلفی داشته باشید. به عنوان مثال ، ممکن است بخواهید پیام های مربوط به سطح WARNING و بالاتر در کنسول وارد شوند ، اما همه موارد دارای سطح ERROR به بالا نیز باید در یک فایل ذخیره شوند. در اینجا برنامه ای است که این کار را انجام می دهد:

# logging_example.py

import logging

# Create a custom logger
logger = logging.getLogger(__name__)

# Create handlers
c_handler = logging.StreamHandler()
f_handler = logging.FileHandler('file.log')
c_handler.setLevel(logging.WARNING)
f_handler.setLevel(logging.ERROR)

# Create formatters and add it to handlers
c_format = logging.Formatter('%(name)s - %(levelname)s - %(message)s')
f_format = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
c_handler.setFormatter(c_format)
f_handler.setFormatter(f_format)

# Add handlers to the logger
logger.addHandler(c_handler)
logger.addHandler(f_handler)

logger.warning('This is a warning')
logger.error('This is an error')

خروجی:

__main__ - WARNING - This is a warning
__main__ - ERROR - This is an error

در اینجا ، logger.warning () یک LogRecord ایجاد می کند که تمام اطلاعات مربوط به رویداد را در خود نگه می دارد و آنها را به همه Handler هایی که دارد: c_handler و f_handler منتقل می کند.

c_handler یک StreamHandler با سطح Warning است و اطلاعات را از LogRecord می گیرد تا در قالب مشخص شده خروجی تولید کند و آن را در کنسول چاپ کند. f_handler یک FileHandler با سطح Error است ، و این LogRecord را نادیده می گیرد زیرا سطح آن Warning است.

وقتی logger.error () فراخوانی می شود ، c_handler دقیقاً مانند قبل رفتار می کند و f_handler یک LogRecord در سطح ERROR بدست می آورد ، بنابراین درست مثل c_handler اقدام به تولید یک خروجی می کند ، اما به جای چاپ آن برای کنسول ، آن را برای پرونده مشخص شده در این قالب ارسال می کند:

2018-08-03 16:12:21,723 - __main__ - ERROR - This is an error

نام logger مربوط به متغیر __name__ به عنوان __main__ ثبت می شود ، این نامی است که Python به ماژولی که اجرا شروع می شود اختصاص می دهد. اگر این پرونده توسط ماژول دیگری وارد شود ، متغیر __name__ با نام آن logging_example مطابقت دارد. این چگونه به نظر می رسد:

# run.py

import logging_example

 خروجی:

logging_example - WARNING - This is a warning
logging_example - ERROR - This is an error