import logging from logging import getLogger from time import perf_counter from typing import Callable from en_tts_app.globals import get_conf_dir, get_log_path from en_tts_app.logging_configuration import (configure_app_logger, configure_file_logger, configure_root_logger, get_file_logger) INITIALIZED = False def ensure_conf_dir_exists(): conf_dir = get_conf_dir() if not conf_dir.is_dir(): root_logger = getLogger() root_logger.debug("Creating configuration directory ...") conf_dir.mkdir(parents=False, exist_ok=False) def configure_external_loggers() -> None: file_logger = get_file_logger() for logger_name in ("httpcore", "httpx", "asyncio", "matplotlib"): logger = getLogger(logger_name) logger.parent = file_logger logger.disabled = False logger.propagate = True logger.level = logging.DEBUG def initialize_app() -> int: global INITIALIZED assert not INITIALIZED # CLI logging = INFO # External loggers go to file-logger # file-logger = DEBUG # # disable mpl temporarily # mpl_logger = getLogger("matplotlib") # mpl_logger.disabled = True # mpl_logger.propagate = False configure_root_logger(logging.INFO) root_logger = getLogger() logfile = get_log_path() try: configure_file_logger(logfile, logging.DEBUG) except Exception as ex: root_logger.exception("Logging to file is not possible. Exiting.", exc_info=ex, stack_info=True) return 1 configure_app_logger(logging.INFO) configure_external_loggers() ensure_conf_dir_exists() # path not encapsulated in "" because it is only console out root_logger.info(f"Log will be written to: {logfile.absolute()}") INITIALIZED = True return 0 def run_main(method: Callable) -> int: global INITIALIZED assert INITIALIZED flogger = get_file_logger() start = perf_counter() success = True try: method() except ValueError as error: success = False logger = getLogger(__name__) logger.debug("ValueError occurred.", exc_info=error) except Exception as error: success = False logger = getLogger(__name__) logger.debug("Exception occurred.", exc_info=error) duration = perf_counter() - start flogger.debug(f"Total duration (seconds): {duration}") exit_code = 0 if success else 1 return exit_code