diff --git a/extensions/photos.py b/extensions/photos.py index b7c9da5..835cbcd 100644 --- a/extensions/photos.py +++ b/extensions/photos.py @@ -1,3 +1,4 @@ +import logging import re from datetime import datetime, timedelta, timezone from os import makedirs, path, remove, system @@ -43,14 +44,18 @@ from modules.security import ( get_current_active_user, get_user, ) -from modules.utils import configGet, logWrite +from modules.utils import configGet + +logger = logging.getLogger(__name__) async def compress_image(image_path: str): image_type = Magic(mime=True).from_file(image_path) if image_type not in ["image/jpeg", "image/png"]: - logWrite(f"Not compressing {image_path} because its mime is '{image_type}'") + logger.info( + "Not compressing %s because its mime is '%s'", image_path, image_type + ) return size_before = path.getsize(image_path) / 1024 @@ -66,12 +71,15 @@ async def compress_image(image_path: str): return task.start() - logWrite(f"Compressing '{Path(image_path).name}'...") + logger.info("Compressing '%s'...", Path(image_path).name) task.join() size_after = path.getsize(image_path) / 1024 - logWrite( - f"Compressed '{Path(image_path).name}' from {size_before} Kb to {size_after} Kb" + logger.info( + "Compressed '%s' from %s Kb to %s Kb", + Path(image_path).name, + size_before, + size_after, ) diff --git a/extensions/users.py b/extensions/users.py index 6371d8f..4ae71a3 100644 --- a/extensions/users.py +++ b/extensions/users.py @@ -1,3 +1,4 @@ +import logging from datetime import datetime, timedelta from uuid import uuid1 @@ -21,7 +22,9 @@ from modules.security import ( get_user, verify_password, ) -from modules.utils import configGet, logWrite +from modules.utils import configGet + +logger = logging.getLogger(__name__) async def send_confirmation(user: str, email: str): @@ -41,9 +44,11 @@ async def send_confirmation(user: str, email: str): col_emails.insert_one( {"user": user, "email": email, "used": False, "code": confirmation_code} ) - logWrite(f"Sent confirmation email to '{email}' with code {confirmation_code}") + logger.info( + "Sent confirmation email to '%s' with code %s", email, confirmation_code + ) except Exception as exp: - logWrite(f"Could not send confirmation email to '{email}' due to: {exp}") + logger.error("Could not send confirmation email to '%s' due to: %s", email, exp) @app.get("/users/me/", response_model=User) diff --git a/modules/mailer.py b/modules/mailer.py index 0ff0927..d8e0a92 100644 --- a/modules/mailer.py +++ b/modules/mailer.py @@ -1,8 +1,11 @@ +import logging from smtplib import SMTP, SMTP_SSL from ssl import create_default_context from traceback import print_exc -from modules.utils import configGet, logWrite +from modules.utils import configGet + +logger = logging.getLogger(__name__) try: if configGet("use_ssl", "mailer", "smtp") is True: @@ -10,7 +13,7 @@ try: configGet("host", "mailer", "smtp"), configGet("port", "mailer", "smtp"), ) - logWrite(f"Initialized SMTP SSL connection") + logger.info("Initialized SMTP SSL connection") elif configGet("use_tls", "mailer", "smtp") is True: mail_sender = SMTP( configGet("host", "mailer", "smtp"), @@ -18,21 +21,21 @@ try: ) mail_sender.starttls(context=create_default_context()) mail_sender.ehlo() - logWrite(f"Initialized SMTP TLS connection") + logger.info("Initialized SMTP TLS connection") else: mail_sender = SMTP( configGet("host", "mailer", "smtp"), configGet("port", "mailer", "smtp") ) mail_sender.ehlo() - logWrite(f"Initialized SMTP connection") + logger.info("Initialized SMTP connection") except Exception as exp: - logWrite(f"Could not initialize SMTP connection to: {exp}") + logger.error("Could not initialize SMTP connection to: %s", exp) print_exc() try: mail_sender.login( configGet("login", "mailer", "smtp"), configGet("password", "mailer", "smtp") ) - logWrite(f"Successfully initialized mailer") + logger.info("Successfully initialized mailer") except Exception as exp: - logWrite(f"Could not login into provided SMTP account due to: {exp}") + logger.error("Could not login into provided SMTP account due to: %s", exp) diff --git a/modules/utils.py b/modules/utils.py index 3f4a9cd..9f1ed5a 100644 --- a/modules/utils.py +++ b/modules/utils.py @@ -1,15 +1,11 @@ +import logging from pathlib import Path -from traceback import print_exc +from traceback import format_exc from typing import Any, Union from ujson import JSONDecodeError, dumps, loads - -# Print to stdout and then to log -def logWrite(message: str, debug: bool = False) -> None: - # save to log file and rotation is to be done - # logAppend(f'{message}', debug=debug) - print(f"{message}", flush=True) +logger = logging.getLogger(__name__) def jsonLoad(filepath: Union[str, Path]) -> Any: @@ -25,13 +21,17 @@ def jsonLoad(filepath: Union[str, Path]) -> Any: try: output = loads(file.read()) except JSONDecodeError: - logWrite( - f"Could not load json file {filepath}: file seems to be incorrect!\n{print_exc()}" + logger.error( + "Could not load json file %s: file seems to be incorrect!\n%s", + filepath, + format_exc(), ) raise except FileNotFoundError: - logWrite( - f"Could not load json file {filepath}: file does not seem to exist!\n{print_exc()}" + logger.error( + "Could not load json file %s: file does not seem to exist!\n%s", + filepath, + format_exc(), ) raise file.close() @@ -50,7 +50,7 @@ def jsonSave(contents: Union[list, dict], filepath: Union[str, Path]) -> None: file.write(dumps(contents, ensure_ascii=False, indent=4)) file.close() except Exception as exp: - logWrite(f"Could not save json file {filepath}: {exp}\n{print_exc()}") + logger.error("Could not save json file %s: %s\n%s", filepath, exp, format_exc()) return diff --git a/photos_api.py b/photos_api.py index b0142db..6d5a497 100644 --- a/photos_api.py +++ b/photos_api.py @@ -1,3 +1,4 @@ +import logging from os import makedirs from pathlib import Path @@ -9,6 +10,12 @@ from modules.scheduler import scheduler makedirs(Path("data/users"), exist_ok=True) +logging.basicConfig( + level=logging.INFO, + format="%(name)s.%(funcName)s | %(levelname)s | %(message)s", + datefmt="[%X]", +) + @app.get("/favicon.ico", response_class=FileResponse, include_in_schema=False) async def favicon():