-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathlogger.py
executable file
·110 lines (95 loc) · 3.21 KB
/
logger.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
import logging
import os
import sys
import time
from os import environ
from logtail import LogtailHandler
from fastapi import Request
# Environment variable for Logtail token
TOKEN_REQUESTS = environ.get("TOKEN_REQUESTS", None)
uvicorn_logger = logging.getLogger("uvicorn")
# Define a formatter for logging
formatter = logging.Formatter(fmt='%(asctime)s - %(levelname)s - %(message)s', datefmt='%Y-%m-%d %H:%M:%S')
# Configure the requests logger
requests_logger = logging.getLogger("requests")
requests_logger.setLevel(logging.INFO)
# Stream handler to log to stdout
stream_handler_2 = logging.StreamHandler(sys.stdout)
stream_handler_2.setFormatter(formatter)
# File handler to log to a file
file_handler_2 = logging.FileHandler(filename='requests.log', encoding='utf-8')
file_handler_2.setFormatter(formatter)
# Logtail handler to send logs to Logtail
logtail_handler_2 = LogtailHandler(source_token=TOKEN_REQUESTS)
logtail_handler_2.setFormatter(formatter)
# Add handlers to the requests logger
requests_logger.addHandler(stream_handler_2)
requests_logger.addHandler(file_handler_2)
requests_logger.addHandler(logtail_handler_2)
async def log_middleware(request: Request, call_next):
"""
Middleware to log request details and processing time.
Args:
request (Request): The incoming request.
call_next (function): The next middleware or endpoint.
Returns:
Response: The response from the next middleware or endpoint.
"""
start = time.time()
response = await call_next(request)
process_time = time.time() - start
log_dict = {
"url": str(request.url),
"method": request.method,
"status": response.status_code,
"process_time": process_time,
}
requests_logger.info(log_dict)
return response
def get_uvicorn_logger_config():
"""
Get the logger configuration for Uvicorn.
Returns:
dict: A dictionary containing the logger configuration.
"""
return {
"version": 1,
"disable_existing_loggers": False,
"formatters": {
"default": {
"()": "uvicorn.logging.DefaultFormatter",
"fmt": "%(levelprefix)s %(asctime)s - %(message)s",
"use_colors": None,
},
"custom": {
"format": "%(asctime)s - %(name)s - %(levelname)s - %(message)s",
},
},
"handlers": {
"default": {
"formatter": "default",
"class": "logging.StreamHandler",
"stream": sys.stdout,
},
"file": {
"formatter": "custom",
"class": "logging.FileHandler",
"filename": "uvicorn.log",
},
"logtail": {
"formatter": "custom",
"class": "logtail.LogtailHandler",
"source_token": os.getenv("TOKEN_UVICORN"),
},
},
"loggers": {
"uvicorn": {
"handlers": ["default", "file", "logtail"],
"level": "INFO",
},
"storage.error": {
"handlers": ["default", "file", "logtail"],
"level": "INFO",
},
},
}