Skip to content

Commit ef5e921

Browse files
authored
Update the middleware logging accuracy (#713)
* Update the middleware logging accuracy * Update the log style
1 parent a2fa592 commit ef5e921

File tree

7 files changed

+159
-161
lines changed

7 files changed

+159
-161
lines changed

backend/common/log.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ def set_custom_logfile() -> None:
9494
log_config = {
9595
'format': settings.LOG_FILE_FORMAT,
9696
'enqueue': True,
97-
'rotation': '5 MB',
97+
'rotation': '00:00',
9898
'retention': '7 days',
9999
'compression': 'tar.gz',
100100
}

backend/core/conf.py

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -53,8 +53,8 @@ class Settings(BaseSettings):
5353
FASTAPI_STATIC_FILES: bool = True
5454

5555
# 数据库
56-
DATABASE_ECHO: bool = False
57-
DATABASE_POOL_ECHO: bool = False
56+
DATABASE_ECHO: bool | Literal['debug'] = False
57+
DATABASE_POOL_ECHO: bool | Literal['debug'] = False
5858
DATABASE_SCHEMA: str = 'fba'
5959
DATABASE_CHARSET: str = 'utf8mb4'
6060

@@ -115,7 +115,6 @@ class Settings(BaseSettings):
115115

116116
# 中间件配置
117117
MIDDLEWARE_CORS: bool = True
118-
MIDDLEWARE_ACCESS: bool = True
119118

120119
# 请求限制配置
121120
REQUEST_LIMITER_REDIS_PREFIX: str = 'fba:limiter'
@@ -151,18 +150,14 @@ class Settings(BaseSettings):
151150
LOG_CID_DEFAULT_VALUE: str = '-'
152151
LOG_CID_UUID_LENGTH: int = 32 # 日志 correlation_id 长度,必须小于等于 32
153152
LOG_STD_LEVEL: str = 'INFO'
154-
LOG_ACCESS_FILE_LEVEL: str = 'INFO'
155-
LOG_ERROR_FILE_LEVEL: str = 'ERROR'
156153
LOG_STD_FORMAT: str = (
157-
'<green>{time:YYYY-MM-DD HH:mm:ss.SSS}</> | <lvl>{level: <8}</> | '
158-
'<cyan> {correlation_id} </> | <lvl>{message}</>'
159-
)
160-
LOG_FILE_FORMAT: str = (
161-
'<green>{time:YYYY-MM-DD HH:mm:ss.SSS}</> | <lvl>{level: <8}</> | '
162-
'<cyan> {correlation_id} </> | <lvl>{message}</>'
154+
'<green>{time:YYYY-MM-DD HH:mm:ss.SSS}</> | <lvl>{level: <8}</> | <cyan>{correlation_id}</> | <lvl>{message}</>'
163155
)
156+
LOG_ACCESS_FILE_LEVEL: str = 'INFO'
157+
LOG_ERROR_FILE_LEVEL: str = 'ERROR'
164158
LOG_ACCESS_FILENAME: str = 'fba_access.log'
165159
LOG_ERROR_FILENAME: str = 'fba_error.log'
160+
LOG_FILE_FORMAT: str = '{time:YYYY-MM-DD HH:mm:ss.SSS} | <lvl>{level: <8}</> | {correlation_id} | <lvl>{message}</>'
166161

167162
# 操作日志
168163
OPERA_LOG_PATH_EXCLUDE: list[str] = [

backend/core/registrar.py

Lines changed: 14 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
from backend.core.path_conf import STATIC_DIR, UPLOAD_DIR
2121
from backend.database.db import create_table
2222
from backend.database.redis import redis_client
23+
from backend.middleware.access_middleware import AccessMiddleware
2324
from backend.middleware.jwt_auth_middleware import JwtAuthMiddleware
2425
from backend.middleware.opera_log_middleware import OperaLogMiddleware
2526
from backend.middleware.state_middleware import StateMiddleware
@@ -69,8 +70,8 @@ def register_app() -> FastAPI:
6970
)
7071

7172
# 注册组件
72-
register_socket_app(app)
7373
register_logger()
74+
register_socket_app(app)
7475
register_static_file(app)
7576
register_middleware(app)
7677
register_router(app)
@@ -110,29 +111,20 @@ def register_middleware(app: FastAPI) -> None:
110111
:param app: FastAPI 应用实例
111112
:return:
112113
"""
113-
# Opera log (必须)
114+
# Opera log
114115
app.add_middleware(OperaLogMiddleware)
115116

116-
# JWT auth (必须)
117+
# State
118+
app.add_middleware(StateMiddleware)
119+
120+
# JWT auth
117121
app.add_middleware(
118122
AuthenticationMiddleware,
119123
backend=JwtAuthMiddleware(),
120124
on_error=JwtAuthMiddleware.auth_exception_handler,
121125
)
122126

123-
# Access log
124-
if settings.MIDDLEWARE_ACCESS:
125-
from backend.middleware.access_middleware import AccessMiddleware
126-
127-
app.add_middleware(AccessMiddleware)
128-
129-
# State
130-
app.add_middleware(StateMiddleware)
131-
132-
# Trace ID (必须)
133-
app.add_middleware(CorrelationIdMiddleware, validator=False)
134-
135-
# CORS(必须放在最下面)
127+
# CORS
136128
if settings.MIDDLEWARE_CORS:
137129
from fastapi.middleware.cors import CORSMiddleware
138130

@@ -145,6 +137,12 @@ def register_middleware(app: FastAPI) -> None:
145137
expose_headers=settings.CORS_EXPOSE_HEADERS,
146138
)
147139

140+
# Access log
141+
app.add_middleware(AccessMiddleware)
142+
143+
# Trace ID
144+
app.add_middleware(CorrelationIdMiddleware, validator=False)
145+
148146

149147
def register_router(app: FastAPI) -> None:
150148
"""

backend/main.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,14 @@
88
from backend.plugin.tools import get_plugins, install_requirements
99
from backend.utils.timezone import timezone
1010

11-
_print_log_style = f'{timezone.to_str(timezone.now(), "%Y-%m-%d %H:%M:%S.%M0")} | fba | - | '
12-
console.print(Text(f'{_print_log_style}检测插件依赖...', style='bold cyan'))
11+
_log_prefix = f'{timezone.to_str(timezone.now(), "%Y-%m-%d %H:%M:%S.%M0")} | {"INFO": <8} | - | '
12+
console.print(Text(f'{_log_prefix}检测插件依赖...', style='bold cyan'))
1313

1414
_plugins = get_plugins()
1515

1616
with Progress(
17-
SpinnerColumn(finished_text=f'[bold green]{_print_log_style}插件准备就绪[/]'),
18-
TextColumn('[bold green]{task.completed}/{task.total}[/]'),
17+
SpinnerColumn(finished_text=f'[bold green]{_log_prefix}插件准备就绪[/]'),
18+
TextColumn('{task.completed}/{task.total}', style='bold green'),
1919
TimeElapsedColumn(),
2020
console=console,
2121
) as progress:
@@ -24,6 +24,6 @@
2424
install_requirements(plugin)
2525
progress.advance(task)
2626

27-
console.print(Text(f'{_print_log_style}启动服务...', style='bold magenta'))
27+
console.print(Text(f'{_log_prefix}启动服务...', style='bold magenta'))
2828

2929
app = register_app()
Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
#!/usr/bin/env python3
22
# -*- coding: utf-8 -*-
3+
import time
4+
35
from fastapi import Request, Response
46
from starlette.middleware.base import BaseHTTPMiddleware, RequestResponseEndpoint
57

@@ -8,7 +10,7 @@
810

911

1012
class AccessMiddleware(BaseHTTPMiddleware):
11-
"""请求日志中间件"""
13+
"""访问日志中间件"""
1214

1315
async def dispatch(self, request: Request, call_next: RequestResponseEndpoint) -> Response:
1416
"""
@@ -18,11 +20,25 @@ async def dispatch(self, request: Request, call_next: RequestResponseEndpoint) -
1820
:param call_next: 下一个中间件或路由处理函数
1921
:return:
2022
"""
23+
path = request.url.path if not request.url.query else request.url.path + '/' + request.url.query
24+
25+
if request.method != 'OPTIONS':
26+
log.info(f'--> 请求开始[{path}]')
27+
log.info(f'请求方式:[{request.method}]')
28+
29+
perf_time = time.perf_counter()
30+
request.state.perf_time = perf_time
31+
2132
start_time = timezone.now()
33+
request.state.start_time = start_time
34+
2235
response = await call_next(request)
23-
end_time = timezone.now()
24-
log.info(
25-
f'{request.client.host: <15} | {request.method: <8} | {response.status_code: <6} | '
26-
f'{request.url.path} | {round((end_time - start_time).total_seconds(), 3) * 1000.0}ms'
27-
)
36+
37+
elapsed = (time.perf_counter() - perf_time) * 1000
38+
39+
if request.method != 'OPTIONS':
40+
log.info(f'接口耗时:[{elapsed:.3f}]ms')
41+
log.info(f'接口状态:[{response.status_code}]')
42+
log.info('<-- 请求结束')
43+
2844
return response

0 commit comments

Comments
 (0)