Record errors in the database

Closes: #12
This commit is contained in:
Edward Betts 2024-02-25 21:42:56 +00:00
parent 274ac0574c
commit 98d11b62a6
1 changed files with 45 additions and 0 deletions

45
geocode/errors_to_db.py Normal file
View File

@ -0,0 +1,45 @@
"""Save errors to the database."""
import logging
import traceback
import flask
from .database import session
from .model import ErrorLog
class DatabaseLoggingHandler(logging.Handler):
"""A logging handler that logs errors to a database."""
def emit(self, record: logging.LogRecord) -> None:
"""Save log reord to database."""
trace = None
if record.exc_info:
trace = traceback.format_exception(*record.exc_info)
# request: flask.Request = record.request # type: ignore
request = flask.request
error_log = ErrorLog(
error_type=record.levelname,
error_message=record.getMessage(),
traceback="".join(trace) if trace else "No traceback available",
context_info={
"url": request.url,
"args": dict(request.args),
"endpoint": request.endpoint,
"pathname": record.pathname,
"lineno": record.lineno,
"module": record.module,
"funcName": record.funcName,
"remote_addr": request.remote_addr,
},
)
session.add(error_log)
session.commit()
def setup_error_recorder(app: flask.Flask) -> None:
"""Save errors to the database."""
db_handler = DatabaseLoggingHandler()
db_handler.setLevel(logging.ERROR)
app.logger.addHandler(db_handler)