diff --git a/mmengine/logging/logger.py b/mmengine/logging/logger.py index 98b5548451b988c0166986684ae1e14b27052d77..85025dba1fdc9f01dec3ef05c3397cc0e9f08ede 100644 --- a/mmengine/logging/logger.py +++ b/mmengine/logging/logger.py @@ -9,6 +9,7 @@ from termcolor import colored from mmengine import dist from mmengine.utils import ManagerMixin +from mmengine.utils.manager import _accquire_lock, _release_lock class MMFormatter(logging.Formatter): @@ -216,6 +217,24 @@ class MMLogger(Logger, ManagerMixin): if record.levelno >= handler.level: handler.handle(record) + def setLevel(self, level): + """Set the logging level of this logger. + + If ``logging.Logger.selLevel`` is called, all ``logging.Logger`` + instances managed by ``logging.Manager`` will clear the cache. Since + ``MMLogger`` is not managed by ``logging.Manager`` anymore, + ``MMLogger`` should override this method to clear caches of all + ``MMLogger`` instance which is managed by :obj:`ManagerMixin`. + + level must be an int or a str. + """ + self.level = logging._checkLevel(level) + _accquire_lock() + # The same logic as `logging.Manager._clear_cache`. + for logger in MMLogger._instance_dict.values(): + logger._cache.clear() + _release_lock() + def print_log(msg, logger: Optional[Union[Logger, str]] = None, diff --git a/tests/test_logging/test_logger.py b/tests/test_logging/test_logger.py index 946e4daaf061c551823398cb79c8ae8b96105f8c..e9d588605e556b02403424206e28897720aad43d 100644 --- a/tests/test_logging/test_logger.py +++ b/tests/test_logging/test_logger.py @@ -159,3 +159,16 @@ class TestLogger: # Test original `get_current_instance` function. MMLogger.get_instance('mmdet') assert MMLogger.get_current_instance().instance_name == 'mmdet' + + def test_set_level(self, capsys): + logger = MMLogger.get_instance('test_set_level') + logger.info('hello') + out, _ = capsys.readouterr() + assert 'INFO' in out + logger.setLevel('WARNING') + logger.info('hello') + out, _ = capsys.readouterr() + assert not out + logger.warning('hello') + out, _ = capsys.readouterr() + assert 'WARNING' in out