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