diff --git a/consumer.py b/consumer.py index 7a78525..1670000 100644 --- a/consumer.py +++ b/consumer.py @@ -10,27 +10,11 @@ from functools import partial from threading import Thread, active_count from src.access import Access +from src.util.helpers import MainLogger from src.docx_converter.docx_solver import DocxBook from src.epub_converter.epub_solver import EpubBook -def configure_file_logger(name: str, filename: str = "logs/converter.log", - filemode: str = "w+", logging_level: int = logging.INFO) -> logging.Logger: - logger = logging.getLogger(name) - - folder_path = os.path.dirname(os.path.abspath(__file__)) - file_path = os.path.join(folder_path, filename) - - file_handler = logging.FileHandler(file_path, mode=filemode) - logger.addHandler(file_handler) - - file_format = logging.Formatter(fmt="%(asctime)s - %(levelname)s - %(message)s " - "[%(filename)s:%(lineno)d in %(funcName)s]") - file_handler.setFormatter(file_format) - logger.setLevel(logging_level) - return logger - - def local_convert_book(book_type: [DocxBook, EpubBook], book_id: int, logger: logging.Logger, params: dict): logger.info(f"Start processing book-{book_id}.") try: @@ -88,7 +72,8 @@ def callback(ch, method, properties, body: bytes, logger: logging.Logger, libre_ def server_run(): - logger = configure_file_logger("consumer") + logger = MainLogger(name="consumer") + logger_object = logger.configure_main_logger() channel = None try: folder_path = os.path.dirname(os.path.abspath(__file__)) @@ -112,17 +97,17 @@ def server_run(): except TypeError as exc: print("TypeError: problem with config, " + str(exc)) except ValueError as exc: - logger.log(logging.ERROR, + logger_object.log(logging.ERROR, f"Queue {conf_param['queue']} is not declared.") raise exc locker = Event() locker.set() channel.basic_consume(queue=conf_param["queue"], auto_ack=True, - on_message_callback=partial(callback, logger=logger, libre_locker=locker)) - logger.info("Connection has been established.") + on_message_callback=partial(callback, logger=logger_object, libre_locker=locker)) + logger_object.info("Connection has been established.") print("Waiting for messages...") - logger.info("Waiting for messages...") + logger_object.info("Waiting for messages...") channel.start_consuming() diff --git a/src/book_solver.py b/src/book_solver.py index 4c42f3f..e036a74 100644 --- a/src/book_solver.py +++ b/src/book_solver.py @@ -28,9 +28,8 @@ class BookSolver: self.preset_path = None self.book_path = None # path to book file, appears after downloading from server self.book_output_path = None # path to json file - self.logger_object = BookLogger(name=f"{__name__}_{self.book_id}", - book_id=book_id, - main_logger=main_logger) + self.logger_object = BookLogger(name=f"{__name__}_{self.book_id}") + self.logger_object.configure_book_logger(book_id=book_id) self.status_wrapper = BookStatusWrapper( access, self.logger_object, book_id) diff --git a/src/docx_converter/docx_solver.py b/src/docx_converter/docx_solver.py index 78903da..9cd172c 100644 --- a/src/docx_converter/docx_solver.py +++ b/src/docx_converter/docx_solver.py @@ -80,9 +80,11 @@ class DocxBook(BookSolver): if __name__ == "__main__": - docx_file_path = f"../../books/docx/output.docx" - logger_object = BookLogger( - name="docx", book_id=docx_file_path.split("/")[-1]) + docx_file_path = f"../../books/docx/3cd6f561b8d7ee6a510c783784c9d018.docx" + + logger_object = BookLogger(name="epub") + logger_object.configure_book_logger(book_id=docx_file_path.split("/")[-1]) + locker = Event() locker.set() diff --git a/src/epub_converter/epub_solver.py b/src/epub_converter/epub_solver.py index 3106797..ba63a34 100644 --- a/src/epub_converter/epub_solver.py +++ b/src/epub_converter/epub_solver.py @@ -52,9 +52,10 @@ class EpubBook(BookSolver): if __name__ == "__main__": - epub_file_path = "../../books/epub/9781634259804.epub" - logger_object = BookLogger( - name="epub", book_id=epub_file_path.split("/")[-1]) + epub_file_path = f"../../books/epub/9781614382264.epub" + + logger_object = BookLogger(name="epub") + logger_object.configure_book_logger(book_id=epub_file_path.split("/")[-1]) html_preprocessor = HtmlPresetsProcessor( logger=logger_object, preset_path="../../presets/epub_presets.json") diff --git a/src/util/helpers.py b/src/util/helpers.py index d5ce7f8..615078b 100644 --- a/src/util/helpers.py +++ b/src/util/helpers.py @@ -27,10 +27,33 @@ class ColoredFormatter(logging.Formatter): return logging.Formatter.format(self, record) -class BookLogger: - def __init__(self, name: str, book_id: Union[int, str], main_logger: logging.Logger = None, - filemode: str = "w+", logging_level: int = logging.INFO, - logging_format: str = "%(asctime)s - %(levelname)s - %(message)s [%(filename)s:%(lineno)d in %(funcName)s]"): +class MainLogger: + def __init__(self, name: str): + self.main_logger = logging.getLogger(name) + + def generate_file_path(self, filename: str): + folder_path = os.path.dirname(os.path.abspath(os.path.join(__file__ ,"../.."))) + folder_path = os.path.join(folder_path, f"logs/{time.strftime('%d-%m-%Y_%H-00')}/") + if not os.path.exists(folder_path): + os.makedirs(folder_path) + file_path = os.path.join(folder_path, filename) + return file_path + + def configure_main_logger(self, filemode: str = "w+", logging_level: int = logging.INFO) -> logging.Logger: + file_path = self.generate_file_path("converter.log") + + file_handler = logging.FileHandler(file_path, mode=filemode) + self.main_logger.addHandler(file_handler) + + logger_format = logging.Formatter(fmt="%(asctime)s - %(levelname)s - %(message)s " + "[%(filename)s:%(lineno)d in %(funcName)s]") + file_handler.setFormatter(logger_format) + self.main_logger.setLevel(logging_level) + return self.main_logger + + +class BookLogger(MainLogger): + def __init__(self, name: str): """ Method for Logger configuration. Logger will write to file. Parameters @@ -49,29 +72,27 @@ class BookLogger: format of record in log file """ - self.main_logger = main_logger - self.logger = logging.getLogger(name) - self.logger.propagate = False + super().__init__(name) + self.book_logger = logging.getLogger(name) + self.book_logger.propagate = False - folder_path = os.path.dirname( - os.path.dirname(os.path.abspath(__file__))) - folder_path = os.path.join(os.path.dirname(folder_path), f"logs/{time.strftime('%d-%m-%Y_%H-00')}/") - filename = f"{book_id}.log" - file_path = os.path.join(folder_path, filename) + def configure_book_logger(self, book_id: Union[int, str], filemode: str = "w+", + logging_level: int = logging.INFO): + file_path = self.generate_file_path(f"{book_id}.log") + book_logger_format: str = "%(asctime)s - %(levelname)s - %(message)s" \ + " [%(filename)s:%(lineno)d in %(funcName)s]" - if not os.path.exists(folder_path): - os.makedirs(folder_path + time.strftime("%Y-%m-%_%H")) file_handler = logging.FileHandler(file_path, mode=filemode) - - file_format = logging.Formatter(logging_format) + self.book_logger.addHandler(file_handler) + file_format = logging.Formatter(book_logger_format) file_handler.setFormatter(file_format) - self.logger.addHandler(file_handler) stream_handler = logging.StreamHandler() - stream_format = ColoredFormatter(logging_format) + stream_format = ColoredFormatter(book_logger_format) stream_handler.setFormatter(stream_format) - self.logger.addHandler(stream_handler) - self.logger.setLevel(logging_level) + self.book_logger.addHandler(stream_handler) + + self.book_logger.setLevel(logging_level) def log(self, message: str, logging_level: int = 20): """ @@ -81,10 +102,10 @@ class BookLogger: message: str body of the message logging_level: int - level of logging + level of logging """ - self.logger.log(msg=message, level=logging_level, stacklevel=2) + self.book_logger.log(msg=message, level=logging_level, stacklevel=2) def log_error_to_main_log(self, message: str = ""): """ Method for logging error to main log file. """