Attach a single in-memory recorder to the requested logger namespace. Idempotent: repeated calls return the same recorder. Parameters ---------- logger_name: Logger namespace to attach the recorder to. capacity: Maximum number of captured records. By default, us
(
*,
logger_name: str = "deeplabcut",
capacity: int = LOG_QUEUE_MAXLEN,
handler_level: int = logging.INFO,
ensure_logger_level: int | None = None,
)
| 203 | |
| 204 | |
| 205 | def install_debug_recorder( |
| 206 | *, |
| 207 | logger_name: str = "deeplabcut", |
| 208 | capacity: int = LOG_QUEUE_MAXLEN, |
| 209 | handler_level: int = logging.INFO, |
| 210 | ensure_logger_level: int | None = None, |
| 211 | ) -> InMemoryDebugRecorder: |
| 212 | """Attach a single in-memory recorder to the requested logger namespace. |
| 213 | |
| 214 | Idempotent: repeated calls return the same recorder. |
| 215 | |
| 216 | Parameters |
| 217 | ---------- |
| 218 | logger_name: |
| 219 | Logger namespace to attach the recorder to. |
| 220 | capacity: |
| 221 | Maximum number of captured records. By default, uses LOG_QUEUE_MAXLEN. |
| 222 | handler_level: |
| 223 | Minimum level stored by the recorder itself. |
| 224 | ensure_logger_level: |
| 225 | Controls whether to adjust the target logger level. |
| 226 | |
| 227 | - None: never modify the logger level |
| 228 | - int: lower the logger only if its effective level is more restrictive |
| 229 | """ |
| 230 | |
| 231 | root_logger = logging.getLogger(logger_name) |
| 232 | |
| 233 | existing = getattr(root_logger, _DEBUG_HANDLER_ATTR, None) |
| 234 | if isinstance(existing, InMemoryDebugRecorder): |
| 235 | return existing |
| 236 | |
| 237 | recorder = InMemoryDebugRecorder(capacity=capacity, level=handler_level) |
| 238 | recorder.set_name("deeplabcut-debug-recorder") |
| 239 | |
| 240 | # Important: |
| 241 | # - attach only to a DLC-owned logger namespace, not the global root logger |
| 242 | # - keep propagation unchanged |
| 243 | # - logger level adjustment, if any, is handled below; "auto" initializes |
| 244 | # an unset logger to ``handler_level`` rather than forcing DEBUG |
| 245 | root_logger.addHandler(recorder) |
| 246 | |
| 247 | if isinstance(ensure_logger_level, int): |
| 248 | # Only lower verbosity if explicitly requested. |
| 249 | if root_logger.getEffectiveLevel() > ensure_logger_level: |
| 250 | root_logger.setLevel(ensure_logger_level) |
| 251 | |
| 252 | setattr(root_logger, _DEBUG_HANDLER_ATTR, recorder) |
| 253 | return recorder |
| 254 | |
| 255 | |
| 256 | def get_debug_recorder(*, logger_name: str = "deeplabcut") -> InMemoryDebugRecorder | None: |