From 744fa7b8a7643024a924ca5e3de80fa0a45f2913 Mon Sep 17 00:00:00 2001 From: Viktor Barzin Date: Sun, 22 Jun 2025 14:00:47 +0000 Subject: [PATCH] use the uvicorn logger; also update dockerfile to run migrations as parto f startup instead of when starting uvicorn --- crawler/1_dump_listings.py | 4 ++-- crawler/Dockerfile | 3 ++- crawler/api/app.py | 24 ++++++++++--------- crawler/logger.py | 49 -------------------------------------- 4 files changed, 17 insertions(+), 63 deletions(-) delete mode 100644 crawler/logger.py diff --git a/crawler/1_dump_listings.py b/crawler/1_dump_listings.py index 63f0667..c61a580 100644 --- a/crawler/1_dump_listings.py +++ b/crawler/1_dump_listings.py @@ -2,9 +2,9 @@ import asyncio import importlib import itertools import json +import logging import pathlib from typing import Any -from logger import get_logger from rec.query import detail_query, listing_query, QueryParameters from rec.districts import get_districts from repositories import ListingRepository @@ -16,7 +16,7 @@ from models import Listing as modelListing dump_images_module = importlib.import_module("3_dump_images") detect_floorplan_module = importlib.import_module("4_detect_floorplan") -logger = get_logger(__file__) +logger = logging.getLogger("uvicorn") async def dump_listings_full( diff --git a/crawler/Dockerfile b/crawler/Dockerfile index 0a577b5..03d8997 100644 --- a/crawler/Dockerfile +++ b/crawler/Dockerfile @@ -40,4 +40,5 @@ EXPOSE 8000 # Set the entry point (adjust to your CLI's entry point) # ENTRYPOINT ["python", "/app/main.py"] # ENTRYPOINT ["/app/runall.sh"] -ENTRYPOINT ["uvicorn", "api.app:app", "--host", "0.0.0.0", "--port", "8000"] +CMD ["/bin/bash" ,"-c" ,"alembic upgrade head && uvicorn api.app:app --host 0.0.0.0 --port 8000"] +# ENTRYPOINT ["uvicorn", "api.app:app", "--host", "0.0.0.0", "--port", "8000"] diff --git a/crawler/api/app.py b/crawler/api/app.py index d623ffb..0adabe7 100644 --- a/crawler/api/app.py +++ b/crawler/api/app.py @@ -1,4 +1,6 @@ import asyncio +import logging +import logging.config from pathlib import Path import queue from threading import Thread @@ -15,7 +17,6 @@ from api.worker import ( ) from fastapi import Depends, FastAPI, HTTPException, Query from api.auth import User -from logger import get_logger from models.listing import QueryParameters from repositories.listing_repository import ListingRepository from repositories.listing_repository import ListingRepository @@ -26,20 +27,21 @@ from alembic import command from alembic.config import Config from contextlib import asynccontextmanager -logger = get_logger(__file__) +logger = logging.getLogger("uvicorn") -@asynccontextmanager -async def lifespan(app: FastAPI): - alembic_cfg = Config("./alembic.ini") - logger.info("Running alembic migrations") - command.upgrade(alembic_cfg, "head") - logger.info("Finished running alembic migrations") - yield - logger.warning("Shutting down") +# @asynccontextmanager +# async def lifespan(app: FastAPI): +# alembic_cfg = Config("./alembic.ini") +# logger.info("Running alembic migrations") +# command.upgrade(alembic_cfg, "head") +# logger.info("Finished running alembic migrations") +# yield +# logger.warning("Shutting down") -app = FastAPI(lifespan=lifespan) +# app = FastAPI(lifespan=lifespan) +app = FastAPI() # Start worker thread WorkerManager(DumpListingsWorker()).start() diff --git a/crawler/logger.py b/crawler/logger.py deleted file mode 100644 index 3bbcb15..0000000 --- a/crawler/logger.py +++ /dev/null @@ -1,49 +0,0 @@ -from functools import lru_cache -import logging -import sys -from pathlib import Path - - -@lru_cache(maxsize=None) -def get_logger( - name: str, - log_file: str = "app.log", - console_level: str = "DEBUG", - file_level: str = "DEBUG", -): - """ - Configure a logger with console and file handlers. - - Args: - name: Logger name (usually __name__). - log_file: Path to the log file. - console_level: Console logging level (INFO, DEBUG, etc.). - file_level: File logging level. - """ - logger = logging.getLogger(name) - logger.setLevel(logging.DEBUG) # Set to lowest level (handlers filter further) - - # Clear existing handlers (avoid duplicates in Jupyter/reloads) - logger.handlers.clear() - - # ---- Console Handler ---- - console_handler = logging.StreamHandler(sys.stdout) - console_handler.setLevel(console_level.upper()) - console_format = logging.Formatter( - "[%(asctime)s] %(levelname)s in %(module)s:%(lineno)d - %(message)s" - # "%(asctime)s - %(name)s - %(levelname)s - %(message)s" - ) - console_handler.setFormatter(console_format) - logger.addHandler(console_handler) - - # ---- File Handler ---- - # Path(log_file).parent.mkdir(parents=True, exist_ok=True) # Ensure dir exists - # file_handler = logging.FileHandler(log_file) - # file_handler.setLevel(file_level.upper()) - # file_format = logging.Formatter( - # "%(asctime)s - %(name)s - %(levelname)s - %(message)s (%(filename)s:%(lineno)d)" - # ) - # file_handler.setFormatter(file_format) - # logger.addHandler(file_handler) # skip files for now - - return logger