Source code for fabrictools.core.logging

"""Internal logging utility for fabrictools."""

from __future__ import annotations

import datetime
import logging
import sys

_LEVELS = {
    "info": logging.INFO,
    "warning": logging.WARNING,
    "error": logging.ERROR,
    "debug": logging.DEBUG,
}

_logger = logging.getLogger("fabrictools")
# Do not rely on logging.basicConfig(): in Jupyter/IPython the root logger often
# already has handlers, so basicConfig is a no-op, and the effective level can be
# WARNING — INFO lines from this package would be dropped. A dedicated handler on
# our logger keeps output visible without changing global root configuration.
_logger.setLevel(logging.DEBUG)
if not _logger.handlers:
    _handler = logging.StreamHandler(sys.stderr)
    _handler.setFormatter(logging.Formatter("%(message)s"))
    _logger.addHandler(_handler)
    _logger.propagate = False


[docs] def log(message: str, level: str = "info") -> None: """Emit a timestamped line on the ``fabrictools`` logger. :param message: Text to log. :param level: One of ``info``, ``warning``, ``error``, ``debug`` (case-insensitive). :type message: str :type level: str """ ts = datetime.datetime.now().strftime("%H:%M:%S") lvl = _LEVELS.get(level.lower(), logging.INFO) _logger.log(lvl, "[%s] %s", ts, message)