from datetime import datetime from logging import FileHandler from pathlib import Path class DatedFileHandler(FileHandler): def __init__(self, file_prefix: str, **kwargs): if not file_prefix: raise ValueError("`file_prefix` argument cannot be empty.") self._file_prefix = file_prefix kwargs["filename"] = self._make_filename() super().__init__(**kwargs) def _make_filename(self) -> str: """ Create the filename for the current logfile, using the configured file prefix and the current date and time. If the directory does not exist, it gets created. :return: A filepath. """ filepath = Path(f"{self._file_prefix}-{datetime.now():%Y%m%d-%H%M%S}.log") if not filepath.parent.is_dir(): filepath.parent.mkdir(parents=True, exist_ok=True) return str(filepath) def do_rollover(self): """ Close the current logfile and create a new one with the current date and time. """ self.acquire() try: if self.stream: self.stream.close() self.baseFilename = self._make_filename() self.stream = self._open() finally: self.release()