Configure logging with one log file per execution.
If output_dir does not exist, write the log in a fallback location
and raise FileNotFoundError so the script crashes immediately.
Source code in src/lstautorta/merge_DL3.py
| def setup_logging(output_dir, run_id):
"""
Configure logging with one log file per execution.
If output_dir does not exist, write the log in a fallback location
and raise FileNotFoundError so the script crashes immediately.
"""
logger = logging.getLogger("merge_DL3")
logger.setLevel(logging.INFO)
logger.handlers.clear()
formatter = logging.Formatter(
fmt="%(asctime)s | %(levelname)s | %(message)s",
datefmt="%Y-%m-%d %H:%M:%S",
)
# Always keep stdout logging
stream_handler = logging.StreamHandler(sys.stdout)
stream_handler.setLevel(logging.INFO)
stream_handler.setFormatter(formatter)
logger.addHandler(stream_handler)
output_path = Path(output_dir)
if not output_path.exists():
fallback_log = Path.cwd() / f"merge_DL3_run{run_id}.log"
file_handler = logging.FileHandler(fallback_log)
file_handler.setLevel(logging.INFO)
file_handler.setFormatter(formatter)
logger.addHandler(file_handler)
logger.info("============================================================")
logger.error("Output directory does not exist: %s", output_path)
logger.error("Fallback log file: %s", fallback_log)
logger.error("Crashing because output directory is missing.")
logger.info("============================================================")
raise FileNotFoundError(f"Output directory does not exist: {output_path}")
log_dir = output_path / "logs"
log_dir.mkdir(exist_ok=True)
log_file = log_dir / f"merge_DL3_run{run_id}.log"
file_handler = logging.FileHandler(log_file)
file_handler.setLevel(logging.INFO)
file_handler.setFormatter(formatter)
logger.addHandler(file_handler)
logger.info("============================================================")
logger.info("Starting merge_DL3.py")
logger.info("Log file: %s", log_file)
return logger, log_file
|