Search code examples
pythonfastapiuvicorn

How to add timestamp to each request in uvicorn logs?


When I run my FastAPI server using uvicorn:

uvicorn main:app --host 0.0.0.0 --port 8000 --log-level info

The log I get after running the server:

INFO:     Started server process [405098]
INFO:     Waiting for application startup.
INFO:     Connect to database...
INFO:     Successfully connected to the database!
INFO:     Application startup complete.
INFO:     Uvicorn running on http://0.0.0.0:8000 (Press CTRL+C to quit)
INFO:     122.179.31.158:54604 - "GET /api/hello_world?num1=5&num2=10 HTTP/1.1" 200 OK

How do I get the time stamp along with the request logging? Like:

INFO:     "2020-07-16:23:34:78" - 122.179.31.158:54604 - "GET /api/hello_world?num1=5&num2=10 HTTP/1.1" 200 OK

Solution

  • You can use Uvicorn's LOGGING_CONFIG

    import uvicorn
    from uvicorn.config import LOGGING_CONFIG
    from fastapi import FastAPI
    
    app = FastAPI()
    
    def run():
        LOGGING_CONFIG["formatters"]["default"]["fmt"] = "%(asctime)s [%(name)s] %(levelprefix)s %(message)s"
        uvicorn.run(app)
    
    if __name__ == '__main__':
        run()
    

    Which will return uvicorn log with the timestamp

    2020-08-20 02:33:53,765 [uvicorn.error] INFO:     Started server process [107131]
    2020-08-20 02:33:53,765 [uvicorn.error] INFO:     Waiting for application startup.
    2020-08-20 02:33:53,765 [uvicorn.error] INFO:     Application startup complete.
    2020-08-20 02:33:53,767 [uvicorn.error] INFO:     Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)