Implemented logging configuration

This commit is contained in:
2026-03-01 14:12:44 +02:00
parent e4345ddc50
commit 04a2f5a46b
3 changed files with 19 additions and 5 deletions
+18 -2
View File
@@ -1,20 +1,29 @@
from fastapi import FastAPI, HTTPException from fastapi import FastAPI, HTTPException
from fastapi.responses import RedirectResponse from fastapi.responses import RedirectResponse
from contextlib import asynccontextmanager
from pydantic import BaseModel from pydantic import BaseModel
from app.utils import generate_short_code from app.utils import generate_short_code
from dotenv import load_dotenv from dotenv import load_dotenv
import os import os
import sqlite3 import sqlite3
from contextlib import asynccontextmanager import logging
# Set up logging configuration
logging.basicConfig(level=logging.INFO,
format="%(asctime)s - %(levelname)s - %(message)s")
logger = logging.getLogger(__name__)
# Database connection setup
@asynccontextmanager @asynccontextmanager
async def lifespan(app: FastAPI): async def lifespan(app: FastAPI):
conn = sqlite3.connect('urls.db') conn = sqlite3.connect('urls.db')
conn.execute('''CREATE TABLE IF NOT EXISTS urls conn.execute('''CREATE TABLE IF NOT EXISTS urls
(id INTEGER PRIMARY KEY, short_code TEXT, original_url TEXT, clicks INTEGER)''') (id INTEGER PRIMARY KEY, short_code TEXT, original_url TEXT, clicks INTEGER)''')
conn.commit() conn.commit()
logger.info("Database initialized or already exists.")
yield yield
conn.close() conn.close()
logger.info("Database connection closed.")
app = FastAPI(lifespan=lifespan) app = FastAPI(lifespan=lifespan)
@@ -27,10 +36,12 @@ class URLRequest(BaseModel):
@app.get("/") @app.get("/")
def home(): def home():
logger.info("Home endpoint accessed.")
return {"message": "URL Shortener API"} return {"message": "URL Shortener API"}
@app.post("/shorten") @app.post("/shorten")
def shorten_url(request: URLRequest): def shorten_url(request: URLRequest):
logger.info(f"Request received to shorten URL: {request.url}")
short_code = generate_short_code() short_code = generate_short_code()
conn = get_db_connection() conn = get_db_connection()
@@ -42,14 +53,18 @@ def shorten_url(request: URLRequest):
conn.commit() conn.commit()
conn.close() conn.close()
return {"short_url": f"{os.getenv('BASE_URL', 'http://localhost:8000')}/{short_code}"} short_url = f"{os.getenv('BASE_URL', 'http://localhost:8000')}/{short_code}"
logger.info(f"Shortened URL created: {short_url}")
return {"short_url": short_url}
@app.get("/{short_code}") @app.get("/{short_code}")
def redirect_to_url(short_code: str): def redirect_to_url(short_code: str):
logger.info(f"Redirect request received for short_code: {short_code}")
conn = get_db_connection() conn = get_db_connection()
url_data = conn.execute("SELECT original_url, clicks FROM urls WHERE short_code = ?", (short_code,)).fetchone() url_data = conn.execute("SELECT original_url, clicks FROM urls WHERE short_code = ?", (short_code,)).fetchone()
if url_data is None: if url_data is None:
logger.warning(f"Shortened URL for {short_code} not found.")
raise HTTPException(status_code=404, detail="Shortened URL not found") raise HTTPException(status_code=404, detail="Shortened URL not found")
original_url, clicks = url_data original_url, clicks = url_data
@@ -57,4 +72,5 @@ def redirect_to_url(short_code: str):
conn.commit() conn.commit()
conn.close() conn.close()
logger.info(f"Redirecting to {original_url}. Total clicks: {clicks + 1}")
return RedirectResponse(url=original_url) return RedirectResponse(url=original_url)
+1 -3
View File
@@ -1,12 +1,10 @@
from fastapi.testclient import TestClient from fastapi.testclient import TestClient
from app.main import app
import sys import sys
import os import os
# Add the 'app' folder to the sys.path
sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))) sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))
from app.main import app # Now this should work correctly from app.main import app
client = TestClient(app) client = TestClient(app)
BIN
View File
Binary file not shown.