import logging from logging.handlers import SMTPHandler from logging import Formatter from flask import request PROJECT = "osm-wikidata" class MatcherSMTPHandler(SMTPHandler): def getSubject(self, record): # noqa: N802 return ( f"{PROJECT} error: {record.exc_info[0].__name__}" if (record.exc_info and record.exc_info[0]) else f"{PROJECT} error: {record.pathname}:{record.lineno:d}" ) class RequestFormatter(Formatter): def format(self, record): record.request = request return super().format(record) def setup_error_mail(app): if not app.config.get("ERROR_MAIL"): return formatter = RequestFormatter( """ Message type: {levelname} Location: {pathname:s}:{lineno:d} Module: {module:s} Function: {funcName:s} Time: {asctime:s} GET args: {request.args!r} URL: {request.url} Message: {message:s} """, style="{", ) mail_handler = MatcherSMTPHandler( app.config["SMTP_HOST"], app.config["MAIL_FROM"], app.config["ADMINS"], app.name + " error", ) mail_handler.setFormatter(formatter) mail_handler.setLevel(logging.ERROR) app.logger.propagate = True app.logger.addHandler(mail_handler)