ranilmukesh commited on
Commit
ab21ced
Β·
1 Parent(s): 30aab52

updated logging api files

Browse files
Files changed (2) hide show
  1. Dockerfile +12 -3
  2. main.py +42 -16
Dockerfile CHANGED
@@ -9,7 +9,7 @@ RUN apt-get update && apt-get install -y \
9
  tzdata \
10
  && rm -rf /var/lib/apt/lists/*
11
 
12
- # Set timezone to Asia/Kolkata (IST)
13
  ENV TZ=Asia/Kolkata
14
  RUN ln -snf /usr/share/zoneinfo/Asia/Kolkata /etc/localtime && echo Asia/Kolkata > /etc/timezone
15
 
@@ -42,11 +42,20 @@ RUN python train_model.py
42
  RUN mkdir -p /tmp/tmp && chown -R user:user /tmp/tmp
43
  RUN ln -s /tmp/tmp tmp
44
 
 
 
 
 
 
 
 
 
 
45
  # Hugging Face PORT is 7860
46
  ENV PORT=7860
47
 
48
  USER user
49
  EXPOSE 7860
50
 
51
- # Run with uvicorn
52
- CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "7860", "--workers", "4"]
 
9
  tzdata \
10
  && rm -rf /var/lib/apt/lists/*
11
 
12
+ # Set timezone to Asia/Kolkata (IST) FIRST
13
  ENV TZ=Asia/Kolkata
14
  RUN ln -snf /usr/share/zoneinfo/Asia/Kolkata /etc/localtime && echo Asia/Kolkata > /etc/timezone
15
 
 
42
  RUN mkdir -p /tmp/tmp && chown -R user:user /tmp/tmp
43
  RUN ln -s /tmp/tmp tmp
44
 
45
+ # Create startup script to ensure proper logging
46
+ RUN cat > /home/user/app/entrypoint.sh << 'EOF'
47
+ #!/bin/bash
48
+ export TZ=Asia/Kolkata
49
+ export PYTHONUNBUFFERED=1
50
+ exec uvicorn main:app --host 0.0.0.0 --port 7860 --workers 4 --log-level info
51
+ EOF
52
+ RUN chmod +x /home/user/app/entrypoint.sh
53
+
54
  # Hugging Face PORT is 7860
55
  ENV PORT=7860
56
 
57
  USER user
58
  EXPOSE 7860
59
 
60
+ # Run with startup script
61
+ ENTRYPOINT ["/home/user/app/entrypoint.sh"]
main.py CHANGED
@@ -10,10 +10,14 @@ from pydantic import BaseModel, Field
10
  from typing import Optional, List
11
  import os
12
  import logging
 
13
  from datetime import datetime
14
  from pytz import timezone
15
  from starlette.middleware.base import BaseHTTPMiddleware
16
 
 
 
 
17
  # Setup IST timezone logging
18
  IST = timezone('Asia/Kolkata')
19
 
@@ -25,20 +29,39 @@ class ISTFormatter(logging.Formatter):
25
  if datefmt:
26
  return dt.strftime(datefmt)
27
  else:
28
- return dt.strftime("%Y-%m-%d %H:%M:%S %Z")
29
-
30
- # Only configure logs from main, not uvicorn multiple times
31
- if not logging.getLogger("uvicorn").handlers:
32
- logging.basicConfig(
33
- level=logging.INFO,
34
- format='[%(asctime)s] %(levelname)s - %(name)s - %(message)s',
35
- datefmt='%Y-%m-%d %H:%M:%S %Z'
36
- )
37
- # Apply IST formatter
38
- for handler in logging.root.handlers:
39
- handler.setFormatter(ISTFormatter('[%(asctime)s] %(levelname)s - %(message)s'))
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
40
 
41
- logger = logging.getLogger(__name__)
42
 
43
  def get_client_ip(request: Request) -> str:
44
  """Extract client IP from request headers or socket"""
@@ -54,11 +77,11 @@ class LoggingMiddleware(BaseHTTPMiddleware):
54
  client_ip = get_client_ip(request)
55
  method = request.method
56
  path = request.url.path
57
- logger.info(f"πŸ“¨ Incoming | IP: {client_ip} | {method} {path}")
58
 
59
  response = await call_next(request)
60
 
61
- logger.info(f"βœ… Response | IP: {client_ip} | {method} {path} | Status: {response.status_code}")
62
  return response
63
 
64
  try:
@@ -113,10 +136,13 @@ def load_artifacts():
113
 
114
  @app.on_event("startup")
115
  async def startup_event():
 
 
 
116
  try:
117
  load_artifacts()
118
  except Exception as e:
119
- logger.error(f"[!] Warning: {e}")
120
 
121
  class StudentData(BaseModel):
122
  Age: int = Field(..., ge=15, le=40)
 
10
  from typing import Optional, List
11
  import os
12
  import logging
13
+ import sys
14
  from datetime import datetime
15
  from pytz import timezone
16
  from starlette.middleware.base import BaseHTTPMiddleware
17
 
18
+ # Ensure IST timezone
19
+ os.environ['TZ'] = 'Asia/Kolkata'
20
+
21
  # Setup IST timezone logging
22
  IST = timezone('Asia/Kolkata')
23
 
 
29
  if datefmt:
30
  return dt.strftime(datefmt)
31
  else:
32
+ return dt.strftime("%Y-%m-%d %H:%M:%S IST")
33
+
34
+ def setup_logging():
35
+ """Setup logging for all loggers to use IST timestamps"""
36
+ formatter = ISTFormatter('[%(asctime)s] %(levelname)s - %(name)s - %(message)s')
37
+
38
+ # Configure root logger
39
+ root_logger = logging.getLogger()
40
+ root_logger.setLevel(logging.INFO)
41
+
42
+ # Remove existing handlers
43
+ for handler in root_logger.handlers[:]:
44
+ root_logger.removeHandler(handler)
45
+
46
+ # Add new handlers with custom formatter
47
+ console_handler = logging.StreamHandler(sys.stdout)
48
+ console_handler.setFormatter(formatter)
49
+ root_logger.addHandler(console_handler)
50
+
51
+ # Configure uvicorn loggers
52
+ for logger_name in ['uvicorn', 'uvicorn.access', 'uvicorn.error', 'fastapi']:
53
+ lg = logging.getLogger(logger_name)
54
+ lg.setLevel(logging.INFO)
55
+ # Clear existing handlers
56
+ for handler in lg.handlers[:]:
57
+ lg.removeHandler(handler)
58
+ # Use root logger's handlers
59
+ lg.handlers = root_logger.handlers
60
+ lg.propagate = True
61
+
62
+ return logging.getLogger(__name__)
63
 
64
+ logger = setup_logging()
65
 
66
  def get_client_ip(request: Request) -> str:
67
  """Extract client IP from request headers or socket"""
 
77
  client_ip = get_client_ip(request)
78
  method = request.method
79
  path = request.url.path
80
+ logger.info(f"πŸ“¨ [IP: {client_ip}] {method} {path}")
81
 
82
  response = await call_next(request)
83
 
84
+ logger.info(f"βœ… [IP: {client_ip}] {method} {path} β†’ {response.status_code}")
85
  return response
86
 
87
  try:
 
136
 
137
  @app.on_event("startup")
138
  async def startup_event():
139
+ logger.info("=" * 60)
140
+ logger.info("Application Startup")
141
+ logger.info("=" * 60)
142
  try:
143
  load_artifacts()
144
  except Exception as e:
145
+ logger.error(f"[!] Startup Error: {e}")
146
 
147
  class StudentData(BaseModel):
148
  Age: int = Field(..., ge=15, le=40)