API Reference
This section provides detailed documentation for the tiered-debug module’s
classes, functions, and types, generated from their docstrings.
Modules
Base implementation for tiered debug logging.
The TieredDebug class provides multi-level debug logging with configurable stack tracing for accurate caller reporting. It supports logging at levels 1-5, with level 1 always logged and levels 2-5 conditional on the configured debug level. Designed for projects like ElasticKeeper and ElasticCheckpoint, it allows flexible logger configuration and stack level adjustments.
Examples
>>> from tiered_debug._base import TieredDebug
>>> debug = TieredDebug(level=2)
>>> debug.level
2
>>> import logging
>>> handler = logging.StreamHandler()
>>> debug.add_handler(
... handler, logging.Formatter("%(message)s")
... )
>>> debug.lv1("Always logged")
>>> debug.lv3("Not logged") # Ignored (level 3 > 2)
- tiered_debug._base.DEFAULTS = {'debug': 1, 'stack': 3}
Default values for debug level (1) and stack level (3).
- class tiered_debug._base.TieredDebug(level: int = 1, stacklevel: int = 3, logger_name: str = 'tiered_debug._base')[source]
Bases:
objectTiered debug logging with configurable levels and stack tracing.
Supports debug logging at levels 1-5, with level 1 always logged and levels 2-5 conditional on the configured debug level. Allows custom stack levels for accurate caller reporting and flexible logger configuration via handlers.
- Parameters:
level – Debug level (1-5, default 1). (int)
stacklevel – Stack level for caller reporting (1-9, default 3). (int)
logger_name – Name for the logger (default “tiered_debug._base”). (str)
- level
Current debug level (1-5). (int)
- stacklevel
Current stack level for caller reporting (1-9). (int)
- logger
Configured logger instance. (logging.Logger)
Examples
>>> debug = TieredDebug(level=2) >>> debug.level 2 >>> import logging >>> handler = logging.StreamHandler() >>> debug.add_handler( ... handler, logging.Formatter("%(message)s") ... ) >>> debug.lv1("Level 1 message") >>> debug.lv3("Level 3 message") # Not logged
Initialize a TieredDebug instance with specified settings.
- property level: int
Get the current debug level (1-5).
- Returns:
Current debug level.
- Return type:
Examples
>>> debug = TieredDebug(level=3) >>> debug.level 3
- property stacklevel: int
Get the current stack level for caller reporting (1-9).
- Returns:
Current stack level.
- Return type:
Examples
>>> debug = TieredDebug(stacklevel=4) >>> debug.stacklevel 4
- property logger: Logger
Get the configured logger instance.
- Returns:
Logger instance for this TieredDebug object.
- Return type:
Examples
>>> debug = TieredDebug() >>> isinstance(debug.logger, logging.Logger) True
- check_val(val: int, kind: str) int[source]
Validate and return a debug or stack level, or default if invalid.
- Parameters:
val – Value to validate. (int)
kind – Type of value (“debug” or “stack”). (str)
- Returns:
Validated value or default if invalid.
- Return type:
- Raises:
ValueError – If kind is neither “debug” nor “stack”.
Examples
>>> debug = TieredDebug() >>> debug.check_val(3, "debug") 3 >>> debug.check_val(0, "debug") # Invalid, returns default 1
- add_handler(handler: Handler, formatter: Formatter | None = None) None[source]
Add a handler to the logger if not already present.
- Parameters:
handler – Handler to add to the logger. (logging.Handler)
formatter – Optional formatter for the handler. (logging.Formatter)
Examples
>>> debug = TieredDebug() >>> import logging >>> handler = logging.StreamHandler() >>> debug.add_handler(handler) >>> handler in debug.logger.handlers True
- change_level(level: int) Iterator[None][source]
Temporarily change the debug level within a context.
- Parameters:
level – Debug level to set temporarily (1-5). (int)
Examples
>>> debug = TieredDebug(level=2) >>> with debug.change_level(4): ... assert debug.level == 4 >>> debug.level 2
- log(level: Literal[1, 2, 3, 4, 5], msg: str, *args, exc_info: bool | None = None, stack_info: bool | None = None, stacklevel: int | None = None, extra: Dict[str, Any] | None = None) None[source]
Log a message at the specified debug level.
- Parameters:
level – Debug level for the message (1-5). (DebugLevel)
msg – Message to log, optionally with format specifiers. (str)
*args – Arguments for message formatting.
exc_info – Include exception info if True. (bool)
stack_info – Include stack trace if True. (bool)
stacklevel – Stack level for caller reporting (1-9). (int)
extra – Extra metadata dictionary. (Dict[str, Any])
- Raises:
ValueError – If level is not between 1 and 5.
TypeError – If extra is not a dictionary or None.
Examples
>>> debug = TieredDebug(level=2) >>> import logging >>> debug.add_handler(logging.StreamHandler()) >>> debug.log(1, "Level 1 message: %s", "test") >>> debug.log(3, "Level 3 message") # Not logged
- lv1(msg: str, *args, exc_info: bool | None = None, stack_info: bool | None = None, stacklevel: int | None = None, extra: Dict[str, Any] | None = None) None[source]
Log a message at debug level 1 (always logged).
- Parameters:
msg – Message to log, optionally with format specifiers. (str)
*args – Arguments for message formatting.
exc_info – Include exception info if True. (bool)
stack_info – Include stack trace if True. (bool)
stacklevel – Stack level for caller reporting (1-9). (int)
extra – Extra metadata dictionary. (Dict[str, Any])
- Raises:
TypeError – If extra is not a dictionary or None.
Examples
>>> debug = TieredDebug(level=2) >>> import logging >>> debug.add_handler(logging.StreamHandler()) >>> debug.lv1("Level 1 message: %s", "test")
- lv2(msg: str, *args, exc_info: bool | None = None, stack_info: bool | None = None, stacklevel: int | None = None, extra: Dict[str, Any] | None = None) None[source]
Log a message at debug level 2 (logged if level >= 2).
- Parameters:
msg – Message to log, optionally with format specifiers. (str)
*args – Arguments for message formatting.
exc_info – Include exception info if True. (bool)
stack_info – Include stack trace if True. (bool)
stacklevel – Stack level for caller reporting (1-9). (int)
extra – Extra metadata dictionary. (Dict[str, Any])
- Raises:
TypeError – If extra is not a dictionary or None.
Examples
>>> debug = TieredDebug(level=2) >>> import logging >>> debug.add_handler(logging.StreamHandler()) >>> debug.lv2("Level 2 message: %s", "test")
- lv3(msg: str, *args, exc_info: bool | None = None, stack_info: bool | None = None, stacklevel: int | None = None, extra: Dict[str, Any] | None = None) None[source]
Log a message at debug level 3 (logged if level >= 3).
- Parameters:
msg – Message to log, optionally with format specifiers. (str)
*args – Arguments for message formatting.
exc_info – Include exception info if True. (bool)
stack_info – Include stack trace if True. (bool)
stacklevel – Stack level for caller reporting (1-9). (int)
extra – Extra metadata dictionary. (Dict[str, Any])
- Raises:
TypeError – If extra is not a dictionary or None.
Examples
>>> debug = TieredDebug(level=3) >>> import logging >>> debug.add_handler(logging.StreamHandler()) >>> debug.lv3("Level 3 message: %s", "test")
- lv4(msg: str, *args, exc_info: bool | None = None, stack_info: bool | None = None, stacklevel: int | None = None, extra: Dict[str, Any] | None = None) None[source]
Log a message at debug level 4 (logged if level >= 4).
- Parameters:
msg – Message to log, optionally with format specifiers. (str)
*args – Arguments for message formatting.
exc_info – Include exception info if True. (bool)
stack_info – Include stack trace if True. (bool)
stacklevel – Stack level for caller reporting (1-9). (int)
extra – Extra metadata dictionary. (Dict[str, Any])
- Raises:
TypeError – If extra is not a dictionary or None.
Examples
>>> debug = TieredDebug(level=4) >>> import logging >>> debug.add_handler(logging.StreamHandler()) >>> debug.lv4("Level 4 message: %s", "test")
- lv5(msg: str, *args, exc_info: bool | None = None, stack_info: bool | None = None, stacklevel: int | None = None, extra: Dict[str, Any] | None = None) None[source]
Log a message at debug level 5 (logged if level >= 5).
- Parameters:
msg – Message to log, optionally with format specifiers. (str)
*args – Arguments for message formatting.
exc_info – Include exception info if True. (bool)
stack_info – Include stack trace if True. (bool)
stacklevel – Stack level for caller reporting (1-9). (int)
extra – Extra metadata dictionary. (Dict[str, Any])
- Raises:
TypeError – If extra is not a dictionary or None.
Examples
>>> debug = TieredDebug(level=5) >>> import logging >>> debug.add_handler(logging.StreamHandler()) >>> debug.lv5("Level 5 message: %s", "test")
Sample usage of tiered debug logging with a global instance and decorator.
Provides a global TieredDebug instance and a begin_end decorator to log function entry and exit at specified debug levels. Designed for use in projects like ElasticKeeper and ElasticCheckpoint to trace function execution with configurable stack levels.
Examples
>>> from tiered_debug.debug import debug, begin_end
>>> debug.level = 3
>>> import logging
>>> debug.add_handler(logging.StreamHandler())
>>> @begin_end(debug, begin=2, end=3, stacklevel=2, extra={"func": "test"})
... def example():
... return "Test"
>>> example()
'Test'
- tiered_debug.debug.DEFAULT_BEGIN = 2
Default debug level for BEGIN messages.
- tiered_debug.debug.DEFAULT_END = 3
Default debug level for END messages.
- tiered_debug.debug.debug = <tiered_debug._base.TieredDebug object>
Global TieredDebug instance with default level 1 and stacklevel 3.
- tiered_debug.debug.begin_end(debug_obj: TieredDebug | None = None, begin: Literal[1, 2, 3, 4, 5] = 2, end: Literal[1, 2, 3, 4, 5] = 3, stacklevel: int = 2, extra: Dict[str, Any] | None = None)[source]
Decorator to log function entry and exit at specified debug levels.
Logs “BEGIN CALL” at the begin level and “END CALL” at the end level using the provided or global debug instance. Adjusts the stacklevel by 1 to report the correct caller.
- Parameters:
debug_obj – TieredDebug instance to use (default: global debug).
begin – Debug level for BEGIN message (1-5, default 2). (int)
end – Debug level for END message (1-5, default 3). (int)
stacklevel – Stack level for reporting (1-9, default 2). (int)
extra – Extra metadata dictionary (default None). (Dict[str, Any])
- Returns:
Decorated function with logging.
- Return type:
Callable
Examples
>>> debug.level = 3 >>> import logging >>> debug.add_handler(logging.StreamHandler()) >>> @begin_end(debug, begin=2, end=3) ... def test_func(): ... return "Result" >>> test_func() 'Result'