Source code for hbutils.testing.isolated.logging

import logging
from contextlib import contextmanager
from typing import Optional, Union, List

from ...collection.recover import get_recovery_func

__all__ = [
    'isolated_logger',
]


[docs]@contextmanager def isolated_logger(logger: Optional[Union[str, logging.Logger]] = None, handlers: Optional[List[logging.Handler]] = None, close_handlers: bool = True): """ Overview: Mock loggers in `logging` module. :param logger: Logger or logger's name for isolation. :param handlers: Initial handlers for isolation. :param close_handlers: Close handler's after complete. Examples:: >>> import logging >>> from rich.logging import RichHandler # a 3rd-party logger >>> from hbutils.testing import isolated_logger >>> >>> logging.error('this is error') # normal log ERROR:root:this is error >>> logging.error('this is error') ERROR:root:this is error >>> with isolated_logger(handlers=[ # replaced with custom handlers ... RichHandler(), ... logging.FileHandler('test_log.txt'), ... ]): ... logging.error('this is error inside 1') ... logging.error('this is error inside 2') [11/08/22 15:39:37] ERROR this is error inside 1 <stdin>:5 ERROR this is error inside 2 <stdin>:6 >>> logging.error('this is error') # change back to normal log ERROR:root:this is error >>> logging.error('this is error') ERROR:root:this is error """ if not isinstance(logger, logging.Logger): logger = logging.getLogger(logger) handlers = list(handlers or []) rf = get_recovery_func(logger) try: logger.handlers[:] = handlers[:] yield logger finally: if close_handlers: for handler in logger.handlers: handler.close() rf()