mirror of
https://github.com/open-mmlab/mmengine.git
synced 2025-06-03 21:54:44 +08:00
[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:
parent
7a074fa478
commit
6ea23a2f71
@ -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
|
||||||
|
@ -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
|
||||||
|
Loading…
x
Reference in New Issue
Block a user