Ведение журнала
Flask использует стандартный Python logging. Сообщения о вашем приложении Flask записываются с помощью 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)
Если вы не настраиваете ведение журнала, по умолчанию уровень логов Python обычно равен «предупреждение». Ничто ниже настроенного уровня не будет видно.
Основная настройка
Когда вы хотите настроить ведение журнала для своего проекта, сделайте это как можно скорее при запуске программы. Если 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–2022 Pallets
Licensed under the BSD 3-clause License.
https://flask.palletsprojects.com/en/2.1.x/logging/