I have a FastAPI application. In this application I want to have a custom logger. In this logger I want to send async requests to some host.
I have an error:
RuntimeError: This event loop is already running
My code:
import asyncio
import functools
class HttpHandler(logging.Handler):
"""
Logging Handler for fluent.
Sends HTTP POST requests
"""
def __init__(self, tag: str, host: str, port: int):
self.tag = tag
self.host = host
self.port = port
self.loop = asyncio.get_event_loop()
self.loop.run_forever()
logging.Handler.__init__(self)
async def emit(self, record: logging.LogRecord):
payload = {} # some data
future = self.loop.run_in_executor(None, functools.partial(requests.post, data={
"url": self.host,
"json": payload
}))
response = await future
In my fastapi app I want to use logger like this:
@app.on_event("startup")
async def startup():
#replace fastapi handlers
logger.handlers = ServiceLogger.get_logger_instance().handlers # special service that gives me custom logger
@app.post("/some_url")
async def foo(body=Depends(get_body)):
logger.info("TEXT")
UPDATE: I was trying to apply aiohttp library
async def emit(self, record: logging.LogRecord):
payload = {
...
"message": record.message # log message
}
await aiohttp.post(self.host, json=payload)
But looks like it's not working because I see warning
RuntimeWarning: coroutine 'HttpHandler.emit' was never awaited
self.emit(record)
RuntimeWarning: Enable tracemalloc to get the object allocation traceback