alessandro trinca tornidor commited on
Commit
90dbc1a
1 Parent(s): 2ba4f98

[feat] add uuid session logger, add typing hints on function arguments

Browse files
app_gradio_fastapi/helpers/__init__.py ADDED
File without changes
app_gradio_fastapi/helpers/formatters.py CHANGED
@@ -1,2 +1,30 @@
1
- def request_formatter(text: str) -> str:
2
- return f"transformed {text}."
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import logging
2
+ from fastapi import HTTPException
3
+
4
+ from app_gradio_fastapi.helpers import session_logger
5
+
6
+
7
+ def divide(a: int, b: int) -> float:
8
+ logging.info(f"a:{a}, b:{b}.")
9
+ result = a / b
10
+ logging.info(f"result:{result}.")
11
+ return result
12
+
13
+
14
+ @session_logger.set_uuid_logging
15
+ def request_formatter(text: str) -> dict:
16
+ logging.info("start request...")
17
+ try:
18
+ logging.info(f"input text we need to treat as an integer: {text}.")
19
+ b = int(text)
20
+ transformed_text = f"input after integer cast: {b}."
21
+ try:
22
+ result_division = divide(100, b)
23
+ logging.info(f"some_function, result_division:{result_division}.")
24
+ return {"text": transformed_text, "result": result_division}
25
+ except ZeroDivisionError as zde:
26
+ logging.info(f"exception:{zde}.")
27
+ raise HTTPException(status_code=500, detail="Internal server error")
28
+ except ValueError as ve:
29
+ logging.info(f"exception:{ve}.")
30
+ raise HTTPException(status_code=500, detail="Internal server error")
app_gradio_fastapi/helpers/session_logger.py ADDED
@@ -0,0 +1,36 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import contextvars
2
+ import logging
3
+ from functools import wraps
4
+ from typing import Callable
5
+
6
+ logging_uuid = contextvars.ContextVar("uuid")
7
+ formatter = '%(asctime)s | %(uuid)s [%(pathname)s:%(module)s %(lineno)d] %(levelname)s | %(message)s'
8
+
9
+
10
+ loggingType = logging.CRITICAL | logging.ERROR | logging.WARNING | logging.INFO | logging.DEBUG
11
+
12
+
13
+ def change_logging(level_log: loggingType = logging.INFO) -> None:
14
+ old_factory = logging.getLogRecordFactory()
15
+
16
+ def record_factory(*args, **kwargs):
17
+ record = old_factory(*args, **kwargs)
18
+ record.uuid = logging_uuid.get("uuid")
19
+ if isinstance(record.msg, str):
20
+ record.msg = record.msg.replace("\\", "\\\\").replace("\n", "\\n")
21
+ return record
22
+
23
+ logging.setLogRecordFactory(record_factory)
24
+ logging.basicConfig(level=level_log, format=formatter, force=True)
25
+
26
+
27
+ def set_uuid_logging(func: Callable) -> Callable:
28
+ @wraps(func)
29
+ def wrapper(*args, **kwargs):
30
+ import uuid
31
+
32
+ current_uuid = f"{uuid.uuid4()}"
33
+ logging_uuid.set(current_uuid)
34
+ return func(*args, **kwargs)
35
+
36
+ return wrapper
app_gradio_fastapi/main.py CHANGED
@@ -3,8 +3,11 @@ from fastapi import FastAPI
3
 
4
  from app_gradio_fastapi import routes
5
  from app_gradio_fastapi.helpers.formatters import request_formatter
 
6
 
7
 
 
 
8
  CUSTOM_GRADIO_PATH = "/"
9
  app = FastAPI(title="logging_app", version="1.0")
10
  app.include_router(routes.router)
 
3
 
4
  from app_gradio_fastapi import routes
5
  from app_gradio_fastapi.helpers.formatters import request_formatter
6
+ from app_gradio_fastapi.helpers.session_logger import change_logging
7
 
8
 
9
+ change_logging()
10
+
11
  CUSTOM_GRADIO_PATH = "/"
12
  app = FastAPI(title="logging_app", version="1.0")
13
  app.include_router(routes.router)
app_gradio_fastapi/routes.py CHANGED
@@ -3,12 +3,15 @@ import logging
3
 
4
  from fastapi import APIRouter
5
 
 
 
6
 
7
  router = APIRouter()
8
 
9
 
10
  @router.get("/health")
11
- def health():
 
12
  try:
13
  logging.info("health check")
14
  return json.dumps({"msg": "ok"})
 
3
 
4
  from fastapi import APIRouter
5
 
6
+ from app_gradio_fastapi.helpers import session_logger
7
+
8
 
9
  router = APIRouter()
10
 
11
 
12
  @router.get("/health")
13
+ @session_logger.set_uuid_logging
14
+ def health() -> str:
15
  try:
16
  logging.info("health check")
17
  return json.dumps({"msg": "ok"})