跳转至

Logger

QuICT.tools.logger.logger

LogFormat

Bases: Enum

The Enum class of the log format. Example: - ''LogFormat.zero'': None - ''LogFormat.full'': time | host | user | pid | tag | level | msg - ''LogFormat.simple'': time | tag | level | msg - ''LogFormat.time_only'': time | msg

Logger

Logger(tag: str, format_: LogFormat = LogFormat.simple, log_level: str = 'INFO')

Bases: object

A wrapper for logging.

The Logger hosts a file handler and a stdout handler. The file handler is set to DEBUG level and will dump all the logging info to the .log folder. It is controlled by environment variable "LOG_DUMP". The stdout handler's log level is set by the parameter log_level or the environment variable "LOG_LEVEL".

Supported "LOG_LEVEL" includes: DEBUG, INFO, WARN, ERROR, CRITICAL.

Example

$ export LOG_DUMP=True LOG_LEVEL=INFO

Parameters:

  • tag(str)

    Log tag for stream and file output.

  • format_(LogFormat)

    Predefined formatter. Defaults to "LogFormat.simple".

  • log_level(str)

    The log level, Defaults to "INFO".

Source code in QuICT/tools/logger/logger.py
def __init__(
    self,
    tag: str,
    format_: LogFormat = LogFormat.simple,
    log_level: str = "INFO"
):
    self._format = logging.Formatter(fmt=format_.value, datefmt='%Y-%m-%d %H:%M:%S') \
        if format_ is not None else None
    self._stdout_level = os.environ.get("LOG_LEVEL") or LEVEL_MAP[log_level]
    self._logger = logging.getLogger(tag)
    self._logger.setLevel(logging.DEBUG)

    # Set stdout handler
    sh = logging.StreamHandler(sys.stdout)
    sh.setLevel(self._stdout_level)
    sh.setFormatter(self._format)
    self._logger.addHandler(sh)
    self._extra = {"host": socket.gethostname(), "user": getpass.getuser(), "tag": tag}

    # Set foldout handler
    if os.environ.get("LOG_DUMP", False) == "True":
        log_dump_folder = os.path.join(
            os.path.abspath(os.path.curdir),
            ".log",
            str(os.getpid())
        )
        if not os.path.exists(log_dump_folder):
            os.makedirs(log_dump_folder)

        filename = f"{tag}.{datetime.now().strftime('%Y-%m-%d+%H:%M')}.log"

        # File handler
        fh = logging.FileHandler(filename=f"{os.path.join(log_dump_folder, filename)}", mode='w', encoding="utf-8")
        fh.setLevel(logging.DEBUG)
        fh.setFormatter(self._format)
        self._logger.addHandler(fh)
critical
critical(msg, *args)

Add a log with ''CRITICAL'' level.

Source code in QuICT/tools/logger/logger.py
@msgdecorate
def critical(self, msg, *args):
    """Add a log with ''CRITICAL'' level."""
    self._logger.critical(msg, *args, extra=self._extra)
debug
debug(msg, *args)

Add a log with ''DEBUG'' level.

Source code in QuICT/tools/logger/logger.py
@msgdecorate
def debug(self, msg, *args):
    """Add a log with ''DEBUG'' level."""
    self._logger.debug(msg, *args, extra=self._extra)
error
error(msg, *args)

Add a log with ''ERROR'' level.

Source code in QuICT/tools/logger/logger.py
@msgdecorate
def error(self, msg, *args):
    """Add a log with ''ERROR'' level."""
    self._logger.error(msg, *args, extra=self._extra)
info
info(msg, *args)

Add a log with ''INFO'' level.

Source code in QuICT/tools/logger/logger.py
@msgdecorate
def info(self, msg, *args):
    """Add a log with ''INFO'' level."""
    self._logger.info(msg, *args, extra=self._extra)
warn
warn(msg, *args)

Add a log with ''WARN'' level.

Source code in QuICT/tools/logger/logger.py
@msgdecorate
def warn(self, msg, *args):
    """Add a log with ''WARN'' level."""
    self._logger.warning(msg, *args, extra=self._extra)

msgdecorate

msgdecorate(func)

The decorator used to construct the log msg.

Source code in QuICT/tools/logger/logger.py
def msgdecorate(func):
    """The decorator used to construct the log msg."""

    def _decorator(self, msg, *args):
        if not isinstance(msg, str):
            msg = repr(msg)

        if args:
            func(self, "%s %s", msg, repr(args))
        else:
            func(self, "%s", msg)

    return _decorator