[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 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): class MMFormatter(logging.Formatter):
"""Colorful format for MMLogger. If the log level is error, the logger will """Colorful format for MMLogger. If the log level is error, the logger will
additionally output the location of the code. additionally output the location of the code.
@ -164,6 +193,7 @@ class MMLogger(Logger, ManagerMixin):
# Only rank0 `StreamHandler` will log messages below error level. # Only rank0 `StreamHandler` will log messages below error level.
stream_handler.setLevel(log_level) if rank == 0 else \ stream_handler.setLevel(log_level) if rank == 0 else \
stream_handler.setLevel(logging.ERROR) stream_handler.setLevel(logging.ERROR)
stream_handler.addFilter(FilterDuplicateWarning(logger_name))
self.handlers.append(stream_handler) self.handlers.append(stream_handler)
if log_file is not None: if log_file is not None:
@ -191,6 +221,7 @@ class MMLogger(Logger, ManagerMixin):
file_handler.setFormatter( file_handler.setFormatter(
MMFormatter(color=False, datefmt='%Y/%m/%d %H:%M:%S')) MMFormatter(color=False, datefmt='%Y/%m/%d %H:%M:%S'))
file_handler.setLevel(log_level) file_handler.setLevel(log_level)
file_handler.addFilter(FilterDuplicateWarning(logger_name))
self.handlers.append(file_handler) self.handlers.append(file_handler)
@classmethod @classmethod

View File

@ -184,3 +184,17 @@ class TestLogger:
logger.warning('hello') logger.warning('hello')
out, _ = capsys.readouterr() out, _ = capsys.readouterr()
assert 'WARNING' in out 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