mirror of
https://github.com/mealie-recipes/mealie.git
synced 2025-12-30 22:00:38 -05:00
rewrite logger to support custom config files (#3104)
This commit is contained in:
@@ -5,7 +5,6 @@ from . import (
|
||||
admin_analytics,
|
||||
admin_backups,
|
||||
admin_email,
|
||||
admin_log,
|
||||
admin_maintenance,
|
||||
admin_management_groups,
|
||||
admin_management_users,
|
||||
@@ -15,7 +14,6 @@ from . import (
|
||||
router = AdminAPIRouter(prefix="/admin")
|
||||
|
||||
router.include_router(admin_about.router, tags=["Admin: About"])
|
||||
router.include_router(admin_log.router, tags=["Admin: Log"])
|
||||
router.include_router(admin_management_users.router, tags=["Admin: Manage Users"])
|
||||
router.include_router(admin_management_groups.router, tags=["Admin: Manage Groups"])
|
||||
router.include_router(admin_email.router, tags=["Admin: Email"])
|
||||
|
||||
@@ -1,44 +0,0 @@
|
||||
from fastapi import APIRouter
|
||||
|
||||
from mealie.core.root_logger import LOGGER_FILE
|
||||
from mealie.core.security import create_file_token
|
||||
|
||||
router = APIRouter(prefix="/logs")
|
||||
|
||||
|
||||
@router.get("/{num}")
|
||||
async def get_log(num: int):
|
||||
"""Doc Str"""
|
||||
with open(LOGGER_FILE, "rb") as f:
|
||||
log_text = tail(f, num)
|
||||
return log_text
|
||||
|
||||
|
||||
@router.get("")
|
||||
async def get_log_file():
|
||||
"""Returns a token to download a file"""
|
||||
return {"fileToken": create_file_token(LOGGER_FILE)}
|
||||
|
||||
|
||||
def tail(f, lines=20):
|
||||
total_lines_wanted = lines
|
||||
|
||||
BLOCK_SIZE = 1024
|
||||
f.seek(0, 2)
|
||||
block_end_byte = f.tell()
|
||||
lines_to_go = total_lines_wanted
|
||||
block_number = -1
|
||||
blocks = []
|
||||
while lines_to_go > 0 and block_end_byte > 0:
|
||||
if block_end_byte - BLOCK_SIZE > 0:
|
||||
f.seek(block_number * BLOCK_SIZE, 2)
|
||||
blocks.append(f.read(BLOCK_SIZE))
|
||||
else:
|
||||
f.seek(0, 0)
|
||||
blocks.append(f.read(block_end_byte))
|
||||
lines_found = blocks[-1].count(b"\n")
|
||||
lines_to_go -= lines_found
|
||||
block_end_byte -= BLOCK_SIZE
|
||||
block_number -= 1
|
||||
all_read_text = b"".join(reversed(blocks))
|
||||
return b"/n".join(all_read_text.splitlines()[-total_lines_wanted:])
|
||||
@@ -1,16 +1,13 @@
|
||||
import contextlib
|
||||
import os
|
||||
import shutil
|
||||
import uuid
|
||||
from pathlib import Path
|
||||
|
||||
from fastapi import APIRouter, HTTPException
|
||||
|
||||
from mealie.core.root_logger import LOGGER_FILE
|
||||
from mealie.pkgs.stats import fs_stats
|
||||
from mealie.routes._base import BaseAdminController, controller
|
||||
from mealie.schema.admin import MaintenanceSummary
|
||||
from mealie.schema.admin.maintenance import MaintenanceLogs, MaintenanceStorageDetails
|
||||
from mealie.schema.admin.maintenance import MaintenanceStorageDetails
|
||||
from mealie.schema.response import ErrorResponse, SuccessResponse
|
||||
|
||||
router = APIRouter(prefix="/maintenance")
|
||||
@@ -72,21 +69,13 @@ class AdminMaintenanceController(BaseAdminController):
|
||||
"""
|
||||
Get the maintenance summary
|
||||
"""
|
||||
log_file_size = 0
|
||||
with contextlib.suppress(FileNotFoundError):
|
||||
log_file_size = os.path.getsize(LOGGER_FILE)
|
||||
|
||||
return MaintenanceSummary(
|
||||
data_dir_size=fs_stats.pretty_size(fs_stats.get_dir_size(self.folders.DATA_DIR)),
|
||||
log_file_size=fs_stats.pretty_size(log_file_size),
|
||||
cleanable_images=clean_images(self.folders.RECIPE_DATA_DIR, dry_run=True),
|
||||
cleanable_dirs=clean_recipe_folders(self.folders.RECIPE_DATA_DIR, dry_run=True),
|
||||
)
|
||||
|
||||
@router.get("/logs", response_model=MaintenanceLogs)
|
||||
def get_logs(self, lines: int = 200):
|
||||
return MaintenanceLogs(logs=tail_log(LOGGER_FILE, lines))
|
||||
|
||||
@router.get("/storage", response_model=MaintenanceStorageDetails)
|
||||
def get_storage_details(self):
|
||||
return MaintenanceStorageDetails(
|
||||
@@ -130,16 +119,3 @@ class AdminMaintenanceController(BaseAdminController):
|
||||
return SuccessResponse.respond(f"{cleaned_dirs} Recipe folders removed")
|
||||
except Exception as e:
|
||||
raise HTTPException(status_code=500, detail=ErrorResponse.respond("Failed to clean directories")) from e
|
||||
|
||||
@router.post("/clean/logs", response_model=SuccessResponse)
|
||||
def clean_logs(self):
|
||||
"""
|
||||
Purges the logs
|
||||
"""
|
||||
try:
|
||||
with contextlib.suppress(FileNotFoundError):
|
||||
os.remove(LOGGER_FILE)
|
||||
LOGGER_FILE.touch()
|
||||
return SuccessResponse.respond("Logs cleaned")
|
||||
except Exception as e:
|
||||
raise HTTPException(status_code=500, detail=ErrorResponse.respond("Failed to clean logs")) from e
|
||||
|
||||
Reference in New Issue
Block a user