Skip to content

Commit 2493650

Browse files
Merge pull request #8 from pamelafox/main
Improvements to get logging working
2 parents 0c69470 + 63f6d4d commit 2493650

File tree

5 files changed

+68
-7
lines changed

5 files changed

+68
-7
lines changed

src/fastapi_app/app.py

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import logging
12
import os
23
import pathlib
34
from datetime import datetime
@@ -12,9 +13,14 @@
1213

1314
from .models import Restaurant, Review, engine
1415

16+
# Setup logger and Azure Monitor:
17+
logger = logging.getLogger("app")
18+
logger.setLevel(logging.INFO)
1519
if os.getenv("APPLICATIONINSIGHTS_CONNECTION_STRING"):
1620
configure_azure_monitor()
1721

22+
23+
# Setup FastAPI app:
1824
app = FastAPI()
1925
parent_path = pathlib.Path(__file__).parent.parent
2026
app.mount("/mount", StaticFiles(directory=parent_path / "static"), name="static")
@@ -32,7 +38,7 @@ def get_db_session():
3238

3339
@app.get("/", response_class=HTMLResponse)
3440
async def index(request: Request, session: Session = Depends(get_db_session)):
35-
print("root called")
41+
logger.info("root called")
3642
statement = (
3743
select(Restaurant, func.avg(Review.rating).label("avg_rating"), func.count(Review.id).label("review_count"))
3844
.outerjoin(Review, Review.restaurant == Restaurant.id)
@@ -53,7 +59,7 @@ async def index(request: Request, session: Session = Depends(get_db_session)):
5359

5460
@app.get("/create", response_class=HTMLResponse)
5561
async def create_restaurant(request: Request):
56-
print("Request for add restaurant page received")
62+
logger.info("Request for add restaurant page received")
5763
return templates.TemplateResponse("create_restaurant.html", {"request": request})
5864

5965

@@ -62,7 +68,7 @@ async def add_restaurant(
6268
request: Request, restaurant_name: str = Form(...), street_address: str = Form(...), description: str = Form(...),
6369
session: Session = Depends(get_db_session)
6470
):
65-
print(f"name: {restaurant_name} address: {street_address} description: {description}")
71+
logger.info("name: %s address: %s description: %s", restaurant_name, street_address, description)
6672
restaurant = Restaurant()
6773
restaurant.name = restaurant_name
6874
restaurant.street_address = street_address

src/fastapi_app/models.py

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import logging
12
import os
23
import typing
34
from datetime import datetime
@@ -6,12 +7,15 @@
67
from dotenv import load_dotenv
78
from sqlmodel import Field, SQLModel, create_engine
89

10+
logger = logging.getLogger("app")
11+
logger.setLevel(logging.INFO)
12+
913
sql_url = ""
1014
if os.getenv("WEBSITE_HOSTNAME"):
11-
print("Connecting to Azure PostgreSQL Flexible server based on AZURE_POSTGRESQL_CONNECTIONSTRING...")
15+
logger.info("Connecting to Azure PostgreSQL Flexible server based on AZURE_POSTGRESQL_CONNECTIONSTRING...")
1216
env_connection_string = os.getenv("AZURE_POSTGRESQL_CONNECTIONSTRING")
1317
if env_connection_string is None:
14-
print("Missing environment variable AZURE_POSTGRESQL_CONNECTIONSTRING")
18+
logger.info("Missing environment variable AZURE_POSTGRESQL_CONNECTIONSTRING")
1519
else:
1620
# Parse the connection string
1721
details = dict(item.split('=') for item in env_connection_string.split())
@@ -23,7 +27,7 @@
2327
)
2428

2529
else:
26-
print("Connecting to local PostgreSQL server based on .env file...")
30+
logger.info("Connecting to local PostgreSQL server based on .env file...")
2731
load_dotenv()
2832
POSTGRES_USERNAME = os.environ.get("DBUSER")
2933
POSTGRES_PASSWORD = os.environ.get("DBPASS")

src/gunicorn.conf.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,6 @@
66
bind = "0.0.0.0:8000"
77
workers = (multiprocessing.cpu_count() * 2) + 1
88

9-
worker_class = "uvicorn.workers.UvicornWorker"
9+
worker_class = "my_uvicorn_worker.MyUvicornWorker"
1010

1111
timeout = 600

src/my_uvicorn_worker.py

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
from uvicorn_worker import UvicornWorker
2+
3+
logconfig_dict = {
4+
"version": 1,
5+
"disable_existing_loggers": False,
6+
"formatters": {
7+
"default": {
8+
"()": "uvicorn.logging.DefaultFormatter",
9+
"format": "%(asctime)s - %(message)s",
10+
},
11+
"access": {
12+
"()": "uvicorn.logging.AccessFormatter",
13+
"format": "%(asctime)s - %(message)s",
14+
},
15+
},
16+
"handlers": {
17+
"default": {
18+
"formatter": "default",
19+
"class": "logging.StreamHandler",
20+
"stream": "ext://sys.stderr",
21+
},
22+
"access": {
23+
"formatter": "access",
24+
"class": "logging.StreamHandler",
25+
"stream": "ext://sys.stdout",
26+
},
27+
},
28+
"loggers": {
29+
"root": {"level": "INFO", "handlers": ["default"]},
30+
"uvicorn.error": {
31+
"level": "INFO",
32+
"handlers": ["default"],
33+
"propagate": False,
34+
},
35+
"uvicorn.access": {
36+
"level": "INFO",
37+
"handlers": ["access"],
38+
"propagate": False,
39+
},
40+
},
41+
}
42+
43+
44+
class MyUvicornWorker(UvicornWorker):
45+
CONFIG_KWARGS = {
46+
"loop": "asyncio",
47+
"http": "auto",
48+
"lifespan": "off",
49+
"log_config": logconfig_dict,
50+
}

src/pyproject.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ dependencies = [
77
"fastapi",
88
"jinja2",
99
"uvicorn[standard]",
10+
"uvicorn-worker",
1011
"python-multipart",
1112
"psycopg2",
1213
"sqlmodel",

0 commit comments

Comments
 (0)