لاگ کردن

فلاسک از 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 یا ثبت نام خود را انتخاب کند. برای جزئیات، با اسناد هر افزونه مشورت کنید.