"""Logging configuration for the askemblaex pipeline.Provides two loggers:* A **main logger** (``askemblaex``) that writes to a shared log file under the output directory's ``logs/`` folder.* **Per-folder loggers** (``askemblaex.folder.<hash>``) that write to a file inside each document's hash-keyed output folder."""from__future__importannotationsimportloggingfrompathlibimportPathfromtypingimportOptional_LOG_FORMAT=("%(asctime)s | %(levelname)-8s | %(name)s | %(message)s")_LOG_FORMAT="%(asctime)s | %(levelname)-8s | %(name)s | %(message)s"
[docs]defsetup_main_logger(log_dir:Path,level:int=logging.INFO,)->logging.Logger:""" Configure the global ``askemblaex`` logger to write to a file. Creates *log_dir* if it does not exist. Idempotent — repeated calls do not add duplicate handlers. Args: log_dir: Directory where ``askemblaex.log`` will be written. level: Logging level (default :data:`logging.INFO`). Returns: The configured ``askemblaex`` :class:`logging.Logger` instance. """log_dir.mkdir(parents=True,exist_ok=True)log_file=log_dir/"askemblaex.log"logger=logging.getLogger("askemblaex")logger.setLevel(level)logger.propagate=Falseifnotlogger.handlers:handler=logging.FileHandler(log_file,encoding="utf-8")handler.setFormatter(logging.Formatter(_LOG_FORMAT))logger.addHandler(handler)returnlogger
[docs]defget_folder_logger(folder:Path,*,log_name:str,level:int=logging.INFO,)->logging.Logger:""" Create or retrieve a per-document logger that writes to ``<folder>/<log_name>.log``. Idempotent — if a logger with the same name already has handlers, the existing instance is returned unchanged. Args: folder: Hash-keyed document output folder. Created if absent. log_name: Base name for the log file (usually the document hash). level: Logging level (default :data:`logging.INFO`). Returns: A :class:`logging.Logger` named ``askemblaex.folder.<log_name>``. """folder.mkdir(parents=True,exist_ok=True)log_file=folder/f"{log_name}.log"logger_name=f"askemblaex.folder.{log_name}"logger=logging.getLogger(logger_name)logger.setLevel(level)logger.propagate=Falseifnotlogger.handlers:handler=logging.FileHandler(log_file,encoding="utf-8")handler.setFormatter(logging.Formatter(_LOG_FORMAT))logger.addHandler(handler)returnlogger