fix: 修复日志下载报错问题
This commit is contained in:
parent
fb44f88df2
commit
ca711bbdb8
@ -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,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@ -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."}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user