لاگ کردن¶
فلاسک از logging
در پایتون استاندارد استفاده می کند. پیامهای مربوط به برنامه فلاسک شما با app.logger
ثبت میشوند که نامی مشابه app.name
دارد. این لاگر همچنین می تواند برای ثبت پیام های خود استفاده شود.
@app.route('/login', methods=['POST'])
def login():
user = get_user(request.form['username'])
if user.check_password(request.form['password']):
login_user(user)
app.logger.info('%s logged in successfully', user.username)
return redirect(url_for('index'))
else:
app.logger.info('%s failed to log in', user.username)
abort(401)
اگر لاگ را پیکربندی نکنید، سطح گزارش پیشفرض پایتون معمولاً «هشدار» است. هیچ چیزی کمتر از سطح پیکربندی شده قابل مشاهده نخواهد بود.
پیکربندی پایه¶
هنگامی که می خواهید لاگ کردن پروژه خود را پیکربندی کنید، باید در اسرع وقت زمانی که برنامه شروع می شود این کار را انجام دهید. اگر قبل از پیکربندی ورود به سیستم به app.logger
دسترسی داشته باشید، یک کنترل کننده پیش فرض اضافه می کند. در صورت امکان، قبل از ایجاد شی برنامه، ورود به سیستم را پیکربندی کنید.
این مثال از dictConfig()
برای ایجاد یک پیکربندی گزارشگیری مشابه با پیشفرض فلاسک استفاده میکند، البته به جز همه گزارشها:
from logging.config import dictConfig
dictConfig({
'version': 1,
'formatters': {'default': {
'format': '[%(asctime)s] %(levelname)s in %(module)s: %(message)s',
}},
'handlers': {'wsgi': {
'class': 'logging.StreamHandler',
'stream': 'ext://flask.logging.wsgi_errors_stream',
'formatter': 'default'
}},
'root': {
'level': 'INFO',
'handlers': ['wsgi']
}
})
app = Flask(__name__)
پیکربندی پیش فرض¶
اگر خودتان لاگ را پیکربندی نکنید، فلاسک یک StreamHandler
را به صورت خودکار به app.logger
اضافه می کند. در طول درخواستها، به جریانی که سرور WSGI در environ['wsgi.errors']
(که معمولاً sys.stderr
است) مینویسد. خارج از یک درخواست، به sys.stderr
وارد می شود.
حذف کنترل کننده پیش فرض¶
اگر پس از دسترسی به app.logger
ورود به سیستم را پیکربندی کرده اید و باید کنترل کننده پیش فرض را حذف کنید، می توانید آن را وارد و حذف کنید:
from flask.logging import default_handler
app.logger.removeHandler(default_handler)
ایمیل زدن ارور به مدیران¶
هنگام اجرای برنامه بر روی یک سرور راه دور برای تولید، احتمالاً اغلب به پیام های گزارش نگاه نمی کنید. سرور WSGI احتمالاً پیامهای گزارش را به یک فایل ارسال میکند و شما فقط در صورتی آن فایل را بررسی میکنید که کاربر به شما بگوید مشکلی پیش آمده است.
برای فعال بودن در مورد کشف و رفع اشکالات، می توانید یک logging.handlers.SMTPHandler
را پیکربندی کنید تا در صورت ثبت خطاها و بالاتر، ایمیل ارسال کند.
import logging
from logging.handlers import SMTPHandler
mail_handler = SMTPHandler(
mailhost='127.0.0.1',
fromaddr='server-error@example.com',
toaddrs=['admin@example.com'],
subject='Application Error'
)
mail_handler.setLevel(logging.ERROR)
mail_handler.setFormatter(logging.Formatter(
'[%(asctime)s] %(levelname)s in %(module)s: %(message)s'
))
if not app.debug:
app.logger.addHandler(mail_handler)
این مستلزم آن است که یک سرور SMTP روی همان سرور راه اندازی کنید. برای اطلاعات بیشتر در مورد پیکربندی هندلر به اسناد پایتون مراجعه کنید.
تزریق اطلاعات درخواستی¶
دیدن اطلاعات بیشتر در مورد درخواست، مانند آدرس IP، ممکن است به رفع اشکال برخی از خطاها کمک کند. میتوانید برای تزریق فیلدهای خود که میتوانند در پیامها استفاده شوند، logging.Formatter
را زیرکلاس کنید. میتوانید فرمتکننده کنترلکننده پیشفرض Flask، کنترلکننده نامه تعریفشده در بالا، یا هر کنترلکننده دیگری را تغییر دهید.
from flask import has_request_context, request
from flask.logging import default_handler
class RequestFormatter(logging.Formatter):
def format(self, record):
if has_request_context():
record.url = request.url
record.remote_addr = request.remote_addr
else:
record.url = None
record.remote_addr = None
return super().format(record)
formatter = RequestFormatter(
'[%(asctime)s] %(remote_addr)s requested %(url)s\n'
'%(levelname)s in %(module)s: %(message)s'
)
default_handler.setFormatter(formatter)
mail_handler.setFormatter(formatter)
سایر کتابخانه ها¶
کتابخانههای دیگر ممکن است به طور گسترده از ثبت استفاده کنند، و شما میخواهید پیامهای مرتبط را نیز از آن گزارشها ببینید. ساده ترین راه برای انجام این کار اضافه کردن کنترلرها به روت لاگر به جای اپ لاگر است.
from flask.logging import default_handler
root = logging.getLogger()
root.addHandler(default_handler)
root.addHandler(mail_handler)
بسته به پروژه شما، ممکن است به جای پیکربندی فقط روت لاگر، پیکربندی هر لاگر مورد نظرتان به طور جداگانه مفید باشد.
for logger in (
app.logger,
logging.getLogger('sqlalchemy'),
logging.getLogger('other_package'),
):
logger.addHandler(default_handler)
logger.addHandler(mail_handler)
کتابخانه Werkzeug¶
Werkzeug اطلاعات اولیه درخواست/پاسخ را به ثبتکننده 'werkzeug'
ثبت میکند. اگر root logger پیکربندی نشده باشد، Werkzeug یک StreamHandler
را به لاگر خود اضافه می کند.
افزونه های فلسک¶
بسته به موقعیت، یک برنامه افزودنی ممکن است ورود به app.logger
یا ثبت نام خود را انتخاب کند. برای جزئیات، با اسناد هر افزونه مشورت کنید.