Spec-Zone.ru › Flask 1.0

Ведение журнала

Flask использует стандартный Python logging. Все сообщения, связанные с Flask, регистрируются в пространстве имен логгера 'flask'. Flask.logger возвращает логгер с именем 'flask.app', и его можно использовать для регистрации сообщений вашего приложения.

@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() для создания конфигурации ведения журнала, аналогичной по умолчанию для Flask, за исключением всех записей журнала:

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__)

Конфигурация по умолчанию

Если вы не настраиваете ведение журнала самостоятельно, Flask автоматически добавит 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-сервер на том же сервере. Более подробную информацию о настройке обработчика см. в документации Python.

Вставка информации о запросе

Дополнительная информация о запросе, такая как 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'. Если у корневого логгера нет обработчиков, Werkzeug добавляет StreamHandler в свой логгер.

Расширения Flask

В зависимости от ситуации расширение может выбрать регистрировать данные в app.logger или в собственном логгере с именем. Для получения подробной информации см. документацию каждого расширения.

© 2007–2020 Pallets
Licensed under the BSD 3-clause License.
https://flask.palletsprojects.com/en/1.0.x/logging/

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API