| 40 | verbose_fh: logging.FileHandler |
| 41 | |
| 42 | def __init__(self, logger: logging.Logger, node: str = "suite"): |
| 43 | self._logger = logger |
| 44 | # 1 means log everything, this will be used by file handlers if their level |
| 45 | # is not set |
| 46 | self._logger.setLevel(1) |
| 47 | |
| 48 | self.node = node |
| 49 | |
| 50 | # add handler to emit to stdout |
| 51 | sh = logging.StreamHandler() |
| 52 | sh.setFormatter(logging.Formatter(stream_fmt, date_fmt)) |
| 53 | sh.setLevel(logging.INFO) # console handler default level |
| 54 | |
| 55 | if SETTINGS.verbose is True: |
| 56 | sh.setLevel(logging.DEBUG) |
| 57 | |
| 58 | self._logger.addHandler(sh) |
| 59 | self.sh = sh |
| 60 | |
| 61 | # prepare the output folder |
| 62 | if not os.path.exists(SETTINGS.output_dir): |
| 63 | os.mkdir(SETTINGS.output_dir) |
| 64 | |
| 65 | logging_path_prefix = os.path.join(SETTINGS.output_dir, node) |
| 66 | |
| 67 | fh = logging.FileHandler(f"{logging_path_prefix}.log") |
| 68 | fh.setFormatter( |
| 69 | logging.Formatter( |
| 70 | fmt="%(asctime)s - %(name)s - %(levelname)s - %(message)s", |
| 71 | datefmt=date_fmt, |
| 72 | ) |
| 73 | ) |
| 74 | |
| 75 | self._logger.addHandler(fh) |
| 76 | self.fh = fh |
| 77 | |
| 78 | # This outputs EVERYTHING, intended for post-mortem debugging |
| 79 | # Also optimized for processing via AWK (awk -F '|' ...) |
| 80 | verbose_fh = logging.FileHandler(f"{logging_path_prefix}.verbose.log") |
| 81 | verbose_fh.setFormatter( |
| 82 | logging.Formatter( |
| 83 | fmt="%(asctime)s|%(name)s|%(levelname)s|%(pathname)s|%(lineno)d|" |
| 84 | "%(funcName)s|%(process)d|%(thread)d|%(threadName)s|%(message)s", |
| 85 | datefmt=date_fmt, |
| 86 | ) |
| 87 | ) |
| 88 | |
| 89 | self._logger.addHandler(verbose_fh) |
| 90 | self.verbose_fh = verbose_fh |
| 91 | |
| 92 | super(DTSLOG, self).__init__(self._logger, dict(node=self.node)) |
| 93 | |
| 94 | def logger_exit(self) -> None: |
| 95 | """ |