fix: 修复日志下载报错问题

This commit is contained in:
涵曦 2024-07-17 05:21:28 +00:00
parent fb44f88df2
commit ca711bbdb8
2 changed files with 43 additions and 42 deletions

View File

@ -78,49 +78,25 @@ def main():
xiaomusic = XiaoMusic(config) xiaomusic = XiaoMusic(config)
HttpInit(xiaomusic) HttpInit(xiaomusic)
log_config = { from uvicorn.config import LOGGING_CONFIG
"version": 1,
"formatters": {
"default": {
"()": "uvicorn.logging.DefaultFormatter",
"format": f"%(asctime)s [{__version__}] [%(levelname)s] %(filename)s:%(lineno)d: %(message)s",
"use_colors": False,
},
},
"handlers": {
"default": {
"class": "logging.StreamHandler",
"formatter": "default",
"stream": "ext://sys.stdout",
},
"file": {
"class": "logging.FileHandler",
"formatter": "default",
"filename": config.log_file,
"mode": "a",
"encoding": "utf-8",
},
},
"loggers": {
"uvicorn": {
"handlers": ["default", "file"],
"level": "INFO",
},
"uvicorn.error": {
"level": "INFO",
"handlers": ["default", "file"],
"propagate": False,
},
"uvicorn.access": {
"handlers": ["default", "file"],
"level": "INFO",
"propagate": False,
},
},
}
LOGGING_CONFIG["formatters"]["access"] = {
"format": f"%(asctime)s [{__version__}] [%(levelname)s] %(filename)s:%(lineno)d: %(message)s",
"datefmt": "[%X]",
}
LOGGING_CONFIG["handlers"]["access"] = {
"level": "INFO",
"class": "logging.handlers.RotatingFileHandler",
"formatter": "access",
"filename": config.log_file,
"maxBytes": 10 * 1024 * 1024,
"backupCount": 1,
}
uvicorn.run( uvicorn.run(
HttpApp, host=["::", "0.0.0.0"], port=config.port, log_config=log_config HttpApp,
host=["::", "0.0.0.0"],
port=config.port,
log_config=LOGGING_CONFIG,
) )

View File

@ -2,6 +2,8 @@ import asyncio
import json import json
import os import os
import secrets import secrets
import shutil
import tempfile
from contextlib import asynccontextmanager from contextlib import asynccontextmanager
from dataclasses import asdict from dataclasses import asdict
from typing import Annotated from typing import Annotated
@ -10,6 +12,7 @@ from fastapi import Depends, FastAPI, HTTPException, Request, status
from fastapi.security import HTTPBasic, HTTPBasicCredentials from fastapi.security import HTTPBasic, HTTPBasicCredentials
from fastapi.staticfiles import StaticFiles from fastapi.staticfiles import StaticFiles
from pydantic import BaseModel from pydantic import BaseModel
from starlette.background import BackgroundTask
from starlette.responses import FileResponse from starlette.responses import FileResponse
from xiaomusic import __version__ from xiaomusic import __version__
@ -239,7 +242,29 @@ async def downloadjson(data: UrlInfo):
def downloadlog(Verifcation=Depends(verification)): def downloadlog(Verifcation=Depends(verification)):
file_path = xiaomusic.config.log_file file_path = xiaomusic.config.log_file
if os.path.exists(file_path): if os.path.exists(file_path):
return FileResponse(path=file_path, media_type="text/plain") # 创建一个临时文件来保存日志的快照
temp_file = tempfile.NamedTemporaryFile(delete=False)
try:
with open(file_path, "rb") as f:
shutil.copyfileobj(f, temp_file)
temp_file.close()
# 使用BackgroundTask在响应发送完毕后删除临时文件
def cleanup_temp_file(tmp_file_path):
os.remove(tmp_file_path)
background_task = BackgroundTask(cleanup_temp_file, temp_file.name)
return FileResponse(
temp_file.name,
media_type="text/plain",
filename="xiaomusic.txt",
background=background_task,
)
except Exception as e:
os.remove(temp_file.name)
raise HTTPException(
status_code=500, detail="Error capturing log file"
) from e
else: else:
return {"message": "File not found."} return {"message": "File not found."}