Skip to content

toolkit.logging

Modules:

Classes:

Functions:

Attributes:

DEFAULT_FILTER module-attribute

DEFAULT_FILTER: dict[str | None, str | int | bool] = {'everett': INFO, 'git.cmd': INFO, 'jax._src': INFO, 'numba.core': INFO, 'urllib3.connectionpool': INFO}

critical_once module-attribute

critical_once = partial(log_once, 'CRITICAL')

debug_once module-attribute

debug_once = partial(log_once, 'DEBUG')

error_once module-attribute

error_once = partial(log_once, 'ERROR')

info_once module-attribute

info_once = partial(log_once, 'INFO')

success_once module-attribute

success_once = partial(log_once, 'SUCCESS')

timer module-attribute

timer = Timer

trace_once module-attribute

trace_once = partial(log_once, 'TRACE')

warning_once module-attribute

warning_once = partial(log_once, 'WARNING')

Timer

Methods:

Attributes:

Source code in src/toolkit/logging/_timer.py
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
class Timer:
    _end: float
    _start: float
    depth: int | None = None
    level: int | str
    name: str | None

    def __init__(
        self,
        name: str | None = None,
        *,
        depth: int | None = None,
        level: int | str = "DEBUG",
    ) -> None:
        self.name = name
        self.depth = depth
        self.level = level

    def __call__(self, fn: Callable[_P, _T]) -> Callable[_P, _T]:
        if self.name is None:
            self.name = fn.__name__ + "()"
        if self.depth is None:
            self.depth = 3

        @functools.wraps(fn)
        def wrapped(*args: _P.args, **kwargs: _P.kwargs) -> _T:
            with self:
                result: _T = fn(*args, **kwargs)
            return result

        return wrapped

    def __enter__(self) -> None:
        self.start()

    def __exit__(
        self,
        exc_type: type[BaseException] | None,
        exc_value: BaseException | None,
        traceback: types.TracebackType | None,
    ) -> None:
        self.stop()

    @property
    def elapsed(self) -> float:
        return self._end - self._start

    def start(self) -> None:
        self._start = time.perf_counter()

    def stop(self) -> None:
        self._end = time.perf_counter()
        logger.opt(depth=self.depth or 2).log(
            self.level, "{} executed in {} sec.", self.name or "Block", self.elapsed
        )

depth class-attribute instance-attribute

depth: int | None = depth

elapsed property

elapsed: float

level instance-attribute

level: int | str = level

name instance-attribute

name: str | None = name

__call__

__call__(fn: Callable[_P, _T]) -> Callable[_P, _T]
Source code in src/toolkit/logging/_timer.py
35
36
37
38
39
40
41
42
43
44
45
46
47
def __call__(self, fn: Callable[_P, _T]) -> Callable[_P, _T]:
    if self.name is None:
        self.name = fn.__name__ + "()"
    if self.depth is None:
        self.depth = 3

    @functools.wraps(fn)
    def wrapped(*args: _P.args, **kwargs: _P.kwargs) -> _T:
        with self:
            result: _T = fn(*args, **kwargs)
        return result

    return wrapped

__enter__

__enter__() -> None
Source code in src/toolkit/logging/_timer.py
49
50
def __enter__(self) -> None:
    self.start()

__exit__

__exit__(exc_type: type[BaseException] | None, exc_value: BaseException | None, traceback: TracebackType | None) -> None
Source code in src/toolkit/logging/_timer.py
52
53
54
55
56
57
58
def __exit__(
    self,
    exc_type: type[BaseException] | None,
    exc_value: BaseException | None,
    traceback: types.TracebackType | None,
) -> None:
    self.stop()

__init__

__init__(name: str | None = None, *, depth: int | None = None, level: int | str = 'DEBUG') -> None
Source code in src/toolkit/logging/_timer.py
24
25
26
27
28
29
30
31
32
33
def __init__(
    self,
    name: str | None = None,
    *,
    depth: int | None = None,
    level: int | str = "DEBUG",
) -> None:
    self.name = name
    self.depth = depth
    self.level = level

start

start() -> None
Source code in src/toolkit/logging/_timer.py
64
65
def start(self) -> None:
    self._start = time.perf_counter()

stop

stop() -> None
Source code in src/toolkit/logging/_timer.py
67
68
69
70
71
def stop(self) -> None:
    self._end = time.perf_counter()
    logger.opt(depth=self.depth or 2).log(
        self.level, "{} executed in {} sec.", self.name or "Block", self.elapsed
    )

init

init(level: str | int = NOTSET, fpath: StrPath | None = None) -> None
Source code in src/toolkit/logging/_init.py
20
21
22
23
24
25
26
27
28
def init(level: str | int = logging.NOTSET, fpath: tp.StrPath | None = None) -> None:
    rich.traceback.install(show_locals=True)
    logger.remove()
    logger.add(sys.stderr, level=level, filter=DEFAULT_FILTER)
    if fpath is not None:
        fpath: Path = Path(fpath)
        fpath.parent.mkdir(parents=True, exist_ok=True)
        logger.add(fpath.open("w"), level=level, filter=DEFAULT_FILTER)
    logging.basicConfig(handlers=[InterceptHandler()], level=0, force=True)

log_once cached

log_once(level: int | str, message: str, *args, **kwargs) -> None
Source code in src/toolkit/logging/once.py
6
7
8
@functools.cache
def log_once(level: int | str, message: str, *args, **kwargs) -> None:
    logger.opt(depth=1).log(level, message, *args, **kwargs)