parent
							
								
									274ac0574c
								
							
						
					
					
						commit
						98d11b62a6
					
				
							
								
								
									
										45
									
								
								geocode/errors_to_db.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										45
									
								
								geocode/errors_to_db.py
									
									
									
									
									
										Normal 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)
 | 
				
			||||||
		Loading…
	
		Reference in a new issue