[Fix] Fix duplicated warning (#992)

* [Fix] Fix repeated warning

* Add type hint

* Fix unit test

* Rename recorder_dict to seen

* Fix as comment
This commit is contained in:
Mashiro 2023-03-10 19:27:36 +08:00 committed by GitHub
parent 7a074fa478
commit 6ea23a2f71
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 45 additions and 0 deletions

View File

@ -11,6 +11,35 @@ from mmengine.utils import ManagerMixin
from mmengine.utils.manager import _accquire_lock, _release_lock
class FilterDuplicateWarning(logging.Filter):
"""Filter the repeated warning message.
Args:
name (str): name of the filter.
"""
def __init__(self, name: str = 'mmengine'):
super().__init__(name)
self.seen: set = set()
def filter(self, record: LogRecord) -> bool:
"""Filter the repeated warning message.
Args:
record (LogRecord): The log record.
Returns:
bool: Whether to output the log record.
"""
if record.levelno != logging.WARNING:
return True
if record.msg not in self.seen:
self.seen.add(record.msg)
return True
return False
class MMFormatter(logging.Formatter):
"""Colorful format for MMLogger. If the log level is error, the logger will
additionally output the location of the code.
@ -164,6 +193,7 @@ class MMLogger(Logger, ManagerMixin):
# Only rank0 `StreamHandler` will log messages below error level.
stream_handler.setLevel(log_level) if rank == 0 else \
stream_handler.setLevel(logging.ERROR)
stream_handler.addFilter(FilterDuplicateWarning(logger_name))
self.handlers.append(stream_handler)
if log_file is not None:
@ -191,6 +221,7 @@ class MMLogger(Logger, ManagerMixin):
file_handler.setFormatter(
MMFormatter(color=False, datefmt='%Y/%m/%d %H:%M:%S'))
file_handler.setLevel(log_level)
file_handler.addFilter(FilterDuplicateWarning(logger_name))
self.handlers.append(file_handler)
@classmethod

View File

@ -184,3 +184,17 @@ class TestLogger:
logger.warning('hello')
out, _ = capsys.readouterr()
assert 'WARNING' in out
def test_filter(self, capsys):
logger = MMLogger.get_instance('test_filter')
logger.warning('hello')
out, _ = capsys.readouterr()
assert 'WARNING' in out
# Filter repeated warning.
logger.warning('hello')
out, _ = capsys.readouterr()
assert not out
# Pass new warning
logger.warning('hello1')
out, _ = capsys.readouterr()
assert 'WARNING' in out