main:删除 Grafana 仪表板配置文件
更新内容: - 移除 `dashboard.json` 文件,清理不再需要的 Grafana 仪表板配置。 - 简化项目目录结构,删除多余的监控配置以优化维护。
This commit is contained in:
@@ -2,7 +2,7 @@
|
||||
|
||||
from fastapi import Header, HTTPException
|
||||
from typing import Optional
|
||||
from ..core.tracing import set_request_id, generate_request_id
|
||||
from ..core.tracing import set_request_id, generate_request_id, get_request_id as get_current_request_id
|
||||
|
||||
|
||||
async def get_request_id(x_request_id: Optional[str] = Header(None)) -> str:
|
||||
@@ -15,6 +15,12 @@ async def get_request_id(x_request_id: Optional[str] = Header(None)) -> str:
|
||||
Returns:
|
||||
str: 请求ID
|
||||
"""
|
||||
# 先检查 ContextVar 中是否已经有 request_id(由中间件设置)
|
||||
existing_request_id = get_current_request_id()
|
||||
if existing_request_id:
|
||||
return existing_request_id
|
||||
|
||||
# 如果没有,则从请求头获取或生成新的
|
||||
request_id = x_request_id or generate_request_id()
|
||||
set_request_id(request_id)
|
||||
return request_id
|
||||
|
||||
@@ -23,6 +23,8 @@ class Settings(BaseSettings):
|
||||
# 日志配置
|
||||
log_level: str = "INFO"
|
||||
log_format: str = "json"
|
||||
log_file_enabled: bool = False
|
||||
log_file_path: str = "/var/log/app/app.log"
|
||||
|
||||
# 指标配置
|
||||
metrics_enabled: bool = True
|
||||
|
||||
@@ -2,14 +2,39 @@
|
||||
|
||||
import logging
|
||||
import sys
|
||||
from pathlib import Path
|
||||
from typing import Optional
|
||||
from logging.handlers import RotatingFileHandler
|
||||
from pythonjsonlogger.json import JsonFormatter
|
||||
|
||||
from .tracing import get_request_id
|
||||
|
||||
|
||||
class RequestIdFilter(logging.Filter):
|
||||
"""自动添加 request_id 到日志记录的过滤器"""
|
||||
|
||||
def filter(self, record: logging.LogRecord) -> bool:
|
||||
"""
|
||||
为日志记录添加 request_id 字段
|
||||
|
||||
Args:
|
||||
record: 日志记录
|
||||
|
||||
Returns:
|
||||
bool: 总是返回 True(不过滤任何日志)
|
||||
"""
|
||||
# 从 ContextVar 中获取 request_id
|
||||
request_id = get_request_id()
|
||||
# 添加到日志记录中,如果没有则设置为 None
|
||||
record.request_id = request_id if request_id else "-"
|
||||
return True
|
||||
|
||||
|
||||
def setup_logging(
|
||||
level: str = "INFO",
|
||||
format_type: str = "json",
|
||||
logger_name: Optional[str] = None,
|
||||
file_path: Optional[str] = None,
|
||||
) -> logging.Logger:
|
||||
"""
|
||||
配置日志系统
|
||||
@@ -18,6 +43,7 @@ def setup_logging(
|
||||
level: 日志级别 (DEBUG, INFO, WARNING, ERROR, CRITICAL)
|
||||
format_type: 日志格式 ('json' 或 'text')
|
||||
logger_name: 日志器名称,None表示根日志器
|
||||
file_path: 日志文件路径,None表示不写入文件
|
||||
|
||||
Returns:
|
||||
logging.Logger: 配置好的日志器
|
||||
@@ -28,23 +54,45 @@ def setup_logging(
|
||||
# 清除现有处理器
|
||||
logger.handlers.clear()
|
||||
|
||||
# 创建控制台处理器
|
||||
handler = logging.StreamHandler(sys.stdout)
|
||||
handler.setLevel(getattr(logging, level.upper()))
|
||||
|
||||
# 设置格式
|
||||
if format_type == "json":
|
||||
formatter = JsonFormatter(
|
||||
"%(asctime)s %(name)s %(levelname)s %(message)s",
|
||||
"%(asctime)s %(name)s %(levelname)s %(message)s %(request_id)s",
|
||||
timestamp=True,
|
||||
)
|
||||
else:
|
||||
formatter = logging.Formatter(
|
||||
"%(asctime)s - %(name)s - %(levelname)s - %(message)s",
|
||||
"%(asctime)s - %(name)s - %(levelname)s - [%(request_id)s] - %(message)s",
|
||||
datefmt="%Y-%m-%d %H:%M:%S",
|
||||
)
|
||||
|
||||
handler.setFormatter(formatter)
|
||||
logger.addHandler(handler)
|
||||
# 创建 RequestIdFilter
|
||||
request_id_filter = RequestIdFilter()
|
||||
|
||||
# 创建控制台处理器
|
||||
console_handler = logging.StreamHandler(sys.stdout)
|
||||
console_handler.setLevel(getattr(logging, level.upper()))
|
||||
console_handler.setFormatter(formatter)
|
||||
console_handler.addFilter(request_id_filter)
|
||||
logger.addHandler(console_handler)
|
||||
|
||||
# 创建文件处理器(如果指定了文件路径)
|
||||
if file_path:
|
||||
# 确保日志目录存在
|
||||
log_dir = Path(file_path).parent
|
||||
log_dir.mkdir(parents=True, exist_ok=True)
|
||||
|
||||
# 创建 RotatingFileHandler
|
||||
# 最大 100MB,保留 5 个备份
|
||||
file_handler = RotatingFileHandler(
|
||||
file_path,
|
||||
maxBytes=100 * 1024 * 1024, # 100MB
|
||||
backupCount=5,
|
||||
encoding="utf-8",
|
||||
)
|
||||
file_handler.setLevel(getattr(logging, level.upper()))
|
||||
file_handler.setFormatter(formatter)
|
||||
file_handler.addFilter(request_id_filter)
|
||||
logger.addHandler(file_handler)
|
||||
|
||||
return logger
|
||||
|
||||
@@ -9,6 +9,7 @@ import time
|
||||
from .api import router
|
||||
from .config import settings
|
||||
from .core.logging import setup_logging
|
||||
from .core.tracing import generate_request_id, set_request_id, get_request_id
|
||||
from .core.metrics_unified import (
|
||||
get_metrics_manager,
|
||||
incr,
|
||||
@@ -20,7 +21,11 @@ from .core.metrics_unified import (
|
||||
from .core.job_manager import get_job_manager, shutdown_job_manager
|
||||
|
||||
# 设置日志
|
||||
setup_logging(level=settings.log_level, format_type=settings.log_format)
|
||||
setup_logging(
|
||||
level=settings.log_level,
|
||||
format_type=settings.log_format,
|
||||
file_path=settings.log_file_path if settings.log_file_enabled else None,
|
||||
)
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
# 创建 FastAPI 应用
|
||||
@@ -47,6 +52,10 @@ app.add_middleware(
|
||||
@app.middleware("http")
|
||||
async def log_requests(request: Request, call_next):
|
||||
"""记录所有HTTP请求"""
|
||||
# 从请求头获取或生成 request_id
|
||||
request_id = request.headers.get("x-request-id") or generate_request_id()
|
||||
set_request_id(request_id)
|
||||
|
||||
logger.info(f"Request: {request.method} {request.url.path}")
|
||||
response = await call_next(request)
|
||||
logger.info(f"Response: {response.status_code}")
|
||||
|
||||
Reference in New Issue
Block a user