| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758 |
- from __future__ import annotations
- import logging
- import tqdm
- class LoggingHandler(logging.Handler):
- def __init__(self, level=logging.NOTSET) -> None:
- super().__init__(level)
- def emit(self, record) -> None:
- try:
- msg = self.format(record)
- tqdm.tqdm.write(msg)
- self.flush()
- except (KeyboardInterrupt, SystemExit):
- raise
- except Exception:
- self.handleError(record)
- def install_logger(given_logger, level=logging.WARNING, fmt="%(levelname)s:%(name)s:%(message)s") -> None:
- """Configures the given logger; format, logging level, style, etc"""
- import coloredlogs
- def add_notice_log_level():
- """Creates a new 'notice' logging level"""
- # inspired by:
- # https://stackoverflow.com/questions/2183233/how-to-add-a-custom-loglevel-to-pythons-logging-facility
- NOTICE_LEVEL_NUM = 25
- logging.addLevelName(NOTICE_LEVEL_NUM, "NOTICE")
- def notice(self, message, *args, **kws):
- if self.isEnabledFor(NOTICE_LEVEL_NUM):
- self._log(NOTICE_LEVEL_NUM, message, args, **kws)
- logging.Logger.notice = notice
- # Add an extra logging level above INFO and below WARNING
- add_notice_log_level()
- # More style info at:
- # https://coloredlogs.readthedocs.io/en/latest/api.html
- field_styles = coloredlogs.DEFAULT_FIELD_STYLES.copy()
- field_styles["asctime"] = {}
- level_styles = coloredlogs.DEFAULT_LEVEL_STYLES.copy()
- level_styles["debug"] = {"color": "white", "faint": True}
- level_styles["notice"] = {"color": "cyan", "bold": True}
- coloredlogs.install(
- logger=given_logger,
- level=level,
- use_chroot=False,
- fmt=fmt,
- level_styles=level_styles,
- field_styles=field_styles,
- )
|