From cb85b14e016b1c1224f8dd4f00064ec281b885b6 Mon Sep 17 00:00:00 2001 From: hay-kot Date: Sat, 7 Aug 2021 15:13:42 -0800 Subject: [PATCH] feat(backend): :heavy_plus_sign: Add Rich for Development Logging --- mealie/app.py | 6 +- mealie/core/root_logger.py | 66 ++++++++++++++----- mealie/db/database.py | 2 - mealie/db/db_base.py | 3 - mealie/db/init_db.py | 4 +- mealie/routes/mealplans/crud.py | 1 - mealie/routes/recipe/comments.py | 1 - mealie/routes/recipe/recipe_crud_routes.py | 1 - mealie/routes/users/sign_up.py | 3 +- mealie/routes/utility_routes.py | 1 - mealie/services/backups/exports.py | 3 +- mealie/services/backups/imports.py | 17 ++--- mealie/services/events.py | 2 - mealie/services/image/image.py | 1 - mealie/services/migrations/_migration_base.py | 1 - mealie/services/migrations/chowdown.py | 3 +- mealie/services/recipe/all_recipes.py | 6 +- mealie/services/scraper/cleaner.py | 9 ++- 18 files changed, 70 insertions(+), 60 deletions(-) diff --git a/mealie/app.py b/mealie/app.py index cdfcff6bde0d..54b6f048472a 100644 --- a/mealie/app.py +++ b/mealie/app.py @@ -1,4 +1,3 @@ -from mealie.services.recipe.all_recipes import subscripte_to_recipe_events import uvicorn from fastapi import FastAPI from fastapi.middleware.gzip import GZipMiddleware @@ -15,6 +14,7 @@ from mealie.routes.shopping_list import shopping_list_router from mealie.routes.site_settings import settings_router from mealie.routes.users import user_router from mealie.services.events import create_general_event +from mealie.services.recipe.all_recipes import subscripte_to_recipe_events logger = get_logger() @@ -86,7 +86,6 @@ def system_startup(): def main(): - uvicorn.run( "app:app", host="0.0.0.0", @@ -94,7 +93,8 @@ def main(): reload=True, reload_dirs=["mealie"], debug=True, - log_level="info", + log_level="debug", + use_colors=True, log_config=None, workers=1, forwarded_allow_ips="*", diff --git a/mealie/core/root_logger.py b/mealie/core/root_logger.py index 9d40bfdb1b61..39149ba7edc5 100644 --- a/mealie/core/root_logger.py +++ b/mealie/core/root_logger.py @@ -1,36 +1,66 @@ import logging -import sys +from dataclasses import dataclass +from functools import lru_cache from mealie.core.config import DATA_DIR +from .config import settings + LOGGER_FILE = DATA_DIR.joinpath("mealie.log") DATE_FORMAT = "%d-%b-%y %H:%M:%S" LOGGER_FORMAT = "%(levelname)s: %(asctime)s \t%(message)s" +LOGGER_HANDLER = None -logging.basicConfig(level=logging.INFO, format=LOGGER_FORMAT, datefmt="%d-%b-%y %H:%M:%S") + +@dataclass +class LoggerConfig: + handlers: list + format: str + date_format: str + logger_file: str + level: str = logging.INFO + + +@lru_cache +def get_logger_config(): + if not settings.PRODUCTION: + from rich.logging import RichHandler + + return LoggerConfig( + handlers=[RichHandler(rich_tracebacks=True)], + format=None, + date_format=None, + logger_file=None, + ) + + return LoggerConfig( + handlers=[ + logging.FileHandler(LOGGER_FILE), + logging.Formatter(LOGGER_FORMAT, datefmt=DATE_FORMAT), + ], + format="%(levelname)s: %(asctime)s \t%(message)s", + date_format="%d-%b-%y %H:%M:%S", + logger_file=LOGGER_FILE, + ) + + +logger_config = get_logger_config() + +logging.basicConfig( + level=logger_config.level, + format=logger_config.format, + datefmt=logger_config.date_format, + handlers=logger_config.handlers, +) def logger_init() -> logging.Logger: """ Returns the Root Loggin Object for Mealie """ - logger = logging.getLogger("mealie") - logger.propagate = False - - # File Handler - output_file_handler = logging.FileHandler(LOGGER_FILE) - handler_format = logging.Formatter(LOGGER_FORMAT, datefmt=DATE_FORMAT) - output_file_handler.setFormatter(handler_format) - - # Stdout - stdout_handler = logging.StreamHandler(sys.stdout) - stdout_handler.setFormatter(handler_format) - - logger.addHandler(output_file_handler) - logger.addHandler(stdout_handler) - - return logger + return logging.getLogger("mealie") root_logger = logger_init() +root_logger.info("Testing Root Logger") def get_logger(module=None) -> logging.Logger: diff --git a/mealie/db/database.py b/mealie/db/database.py index f8e80e2e25af..79cc4b8edf77 100644 --- a/mealie/db/database.py +++ b/mealie/db/database.py @@ -92,11 +92,9 @@ class _Recipes(BaseDocument): ) def subscribe(self, func: Callable) -> None: - print("Subscripe", func) self.observers.append(func) def update_observers(self) -> None: - print("Updating Observers", self.observers) for observer in self.observers: observer() diff --git a/mealie/db/db_base.py b/mealie/db/db_base.py index 7079c3a2943b..8725c3b78f6c 100644 --- a/mealie/db/db_base.py +++ b/mealie/db/db_base.py @@ -21,19 +21,16 @@ class BaseDocument: def get_all( self, session: Session, limit: int = None, order_by: str = None, start=0, end=9999, override_schema=None ) -> list[dict]: - logger.info("Starting Query") eff_schema = override_schema or self.schema if order_by: order_attr = getattr(self.sql_model, str(order_by)) - logger.info("Ending Query") return [ eff_schema.from_orm(x) for x in session.query(self.sql_model).order_by(order_attr.desc()).offset(start).limit(limit).all() ] - logger.info("Ending Query") return [eff_schema.from_orm(x) for x in session.query(self.sql_model).offset(start).limit(limit).all()] def get_all_limit_columns(self, session: Session, fields: list[str], limit: int = None) -> list[SqlAlchemyBase]: diff --git a/mealie/db/init_db.py b/mealie/db/init_db.py index 433fa7101d7e..10b3eea50e69 100644 --- a/mealie/db/init_db.py +++ b/mealie/db/init_db.py @@ -70,9 +70,9 @@ def main(): session = create_session() init_user = db.users.get(session, "1", "id") if init_user: - print("Database Exists") + logger.info("Database Exists") else: - print("Database Doesn't Exists, Initializing...") + logger.info("Database Doesn't Exists, Initializing...") init_db() create_general_event("Initialize Database", "Initialize database with default values", session) diff --git a/mealie/routes/mealplans/crud.py b/mealie/routes/mealplans/crud.py index 7e47e4733421..1ca306f6fc74 100644 --- a/mealie/routes/mealplans/crud.py +++ b/mealie/routes/mealplans/crud.py @@ -29,7 +29,6 @@ def get_all_meals( def get_this_week(session: Session = Depends(generate_session), current_user: UserInDB = Depends(get_current_user)): """ Returns the meal plan data for this week """ plans = db.groups.get_meals(session, current_user.group) - print(plans) if plans: return plans[0] diff --git a/mealie/routes/recipe/comments.py b/mealie/routes/recipe/comments.py index b016deb9a61b..4f17a2ae37bd 100644 --- a/mealie/routes/recipe/comments.py +++ b/mealie/routes/recipe/comments.py @@ -47,7 +47,6 @@ async def delete_comment( ): """ Delete comment from the Database """ comment: CommentOut = db.comments.get(session, id) - print(current_user.id, comment.user.id, current_user.admin) if current_user.id == comment.user.id or current_user.admin: db.comments.delete(session, id) return diff --git a/mealie/routes/recipe/recipe_crud_routes.py b/mealie/routes/recipe/recipe_crud_routes.py index 190012bf896c..9edf435a6408 100644 --- a/mealie/routes/recipe/recipe_crud_routes.py +++ b/mealie/routes/recipe/recipe_crud_routes.py @@ -109,7 +109,6 @@ def get_recipe(recipe_slug: str, session: Session = Depends(generate_session), i if not recipe: raise HTTPException(status.HTTP_404_NOT_FOUND) - print(recipe.settings.public, is_user) if recipe.settings.public or is_user: return recipe diff --git a/mealie/routes/users/sign_up.py b/mealie/routes/users/sign_up.py index 4c3add9e1188..9033c78a738f 100644 --- a/mealie/routes/users/sign_up.py +++ b/mealie/routes/users/sign_up.py @@ -6,8 +6,7 @@ from mealie.db.database import db from mealie.db.db_setup import generate_session from mealie.routes.deps import get_admin_user from mealie.routes.routers import AdminAPIRouter -from mealie.schema.user import (SignUpIn, SignUpOut, SignUpToken, UserIn, - UserInDB) +from mealie.schema.user import SignUpIn, SignUpOut, SignUpToken, UserIn, UserInDB from mealie.services.events import create_user_event from sqlalchemy.orm.session import Session diff --git a/mealie/routes/utility_routes.py b/mealie/routes/utility_routes.py index ab546209ad82..a05076823987 100644 --- a/mealie/routes/utility_routes.py +++ b/mealie/routes/utility_routes.py @@ -12,7 +12,6 @@ router = APIRouter(prefix="/api/utils", tags=["Utils"], include_in_schema=True) async def download_file(file_path: Optional[Path] = Depends(validate_file_token)): """Uses a file token obtained by an active user to retrieve a file from the operating system.""" - print("File Name:", file_path) if not file_path.is_file(): raise HTTPException(status.HTTP_400_BAD_REQUEST) diff --git a/mealie/services/backups/exports.py b/mealie/services/backups/exports.py index 28563464e171..6e9c11cd4060 100644 --- a/mealie/services/backups/exports.py +++ b/mealie/services/backups/exports.py @@ -97,8 +97,7 @@ class ExportDatabase: zip_path = app_dirs.BACKUP_DIR.joinpath(f"{self.main_dir.name}") shutil.make_archive(zip_path, "zip", self.main_dir) - shutil.rmtree(app_dirs.TEMP_DIR) - + shutil.rmtree(app_dirs.TEMP_DIR, ignore_errors=True) return str(zip_path.absolute()) + ".zip" diff --git a/mealie/services/backups/imports.py b/mealie/services/backups/imports.py index 7a45708c7a80..bfffe5d1525f 100644 --- a/mealie/services/backups/imports.py +++ b/mealie/services/backups/imports.py @@ -6,18 +6,10 @@ from typing import Callable from mealie.core.config import app_dirs from mealie.db.database import db -from mealie.schema.admin import ( - CustomPageImport, - CustomPageOut, - GroupImport, - NotificationImport, - RecipeImport, - SettingsImport, - SiteSettings, - SiteTheme, - ThemeImport, - UserImport, -) +from mealie.schema.admin import (CustomPageImport, CustomPageOut, GroupImport, + NotificationImport, RecipeImport, + SettingsImport, SiteSettings, SiteTheme, + ThemeImport, UserImport) from mealie.schema.events import EventNotificationIn from mealie.schema.recipe import CommentOut, Recipe from mealie.schema.user import UpdateGroup, UserInDB @@ -369,6 +361,7 @@ def import_database( if import_themes: theme_report = import_session.import_themes() + page_report = [] if import_pages: page_report = import_session.import_pages() diff --git a/mealie/services/events.py b/mealie/services/events.py index 7dd18b72a760..28cb495d7221 100644 --- a/mealie/services/events.py +++ b/mealie/services/events.py @@ -27,8 +27,6 @@ def post_notifications(event: Event, notification_urls=list[str], hard_fail=Fals if not status and hard_fail: raise Exception("Apprise URL Add Failed") - print(attachment) - apobj.notify( body=event.text, title=event.title, diff --git a/mealie/services/image/image.py b/mealie/services/image/image.py index a8a3e45df8ba..57707b7744f7 100644 --- a/mealie/services/image/image.py +++ b/mealie/services/image/image.py @@ -35,7 +35,6 @@ def write_image(recipe_slug: str, file_data: bytes, extension: str) -> Path: with open(image_path, "ab") as f: shutil.copyfileobj(file_data, f) - print(image_path) minify.minify_image(image_path, force=True) return image_path diff --git a/mealie/services/migrations/_migration_base.py b/mealie/services/migrations/_migration_base.py index b8d90d648512..0c6adca16ac7 100644 --- a/mealie/services/migrations/_migration_base.py +++ b/mealie/services/migrations/_migration_base.py @@ -45,7 +45,6 @@ class MigrationBase(BaseModel): @staticmethod def json_reader(json_file: Path) -> dict: - print(json_file) with open(json_file, "r") as f: return json.loads(f.read()) diff --git a/mealie/services/migrations/chowdown.py b/mealie/services/migrations/chowdown.py index b16847dd689e..9e0b9999ce17 100644 --- a/mealie/services/migrations/chowdown.py +++ b/mealie/services/migrations/chowdown.py @@ -4,8 +4,7 @@ from typing import Optional from mealie.core.config import app_dirs from mealie.schema.admin import MigrationImport from mealie.services.migrations import helpers -from mealie.services.migrations._migration_base import (MigrationAlias, - MigrationBase) +from mealie.services.migrations._migration_base import MigrationAlias, MigrationBase from sqlalchemy.orm.session import Session diff --git a/mealie/services/recipe/all_recipes.py b/mealie/services/recipe/all_recipes.py index 168748b2d846..19f7a3e37c04 100644 --- a/mealie/services/recipe/all_recipes.py +++ b/mealie/services/recipe/all_recipes.py @@ -3,10 +3,13 @@ from functools import lru_cache from fastapi import Response from fastapi.encoders import jsonable_encoder +from mealie.core.root_logger import get_logger from mealie.db.database import db from mealie.db.db_setup import SessionLocal from mealie.schema.recipe import RecipeSummary +logger = get_logger() + @lru_cache(maxsize=1) def get_all_recipes_user(limit, start): @@ -29,10 +32,11 @@ def get_all_recipes_public(limit, start): def clear_all_cache(): - print("Cache Cleared") get_all_recipes_user.cache_clear() get_all_recipes_public.cache_clear() + logger.info("All Recipes Cache Cleared") def subscripte_to_recipe_events(): db.recipes.subscribe(clear_all_cache) + logger.info("All Recipes Subscribed to Database Events") diff --git a/mealie/services/scraper/cleaner.py b/mealie/services/scraper/cleaner.py index 0b410a04f6c3..25607f9a9524 100644 --- a/mealie/services/scraper/cleaner.py +++ b/mealie/services/scraper/cleaner.py @@ -4,8 +4,11 @@ import re from datetime import datetime, timedelta from typing import List +from mealie.core.root_logger import get_logger from slugify import slugify +logger = get_logger() + def clean(recipe_data: dict, url=None) -> dict: """Main entrypoint to clean a recipe extracted from the web @@ -39,13 +42,9 @@ def clean_string(text: str) -> str: if isinstance(text, list): text = text[0] - print(type(text)) - if text == "" or text is None: return "" - print(text) - cleaned_text = html.unescape(text) cleaned_text = re.sub("<[^<]+?>", "", cleaned_text) cleaned_text = re.sub(" +", " ", cleaned_text) @@ -122,7 +121,7 @@ def instructions(instructions) -> List[dict]: return [{"text": _instruction(step["text"])} for step in instructions if step["@type"] == "HowToStep"] except Exception as e: - print(e) + logger.error(e) # Not "@type", try "type" try: return [