Skip to content

Commit

Permalink
Support filtering specified levels message (open-compass#187)
Browse files Browse the repository at this point in the history
* Support filtering message

* minor fix
  • Loading branch information
zhouzaida authored and BunnyRunnerX committed Aug 11, 2023
1 parent e43038d commit 488b7bd
Showing 1 changed file with 69 additions and 4 deletions.
73 changes: 69 additions & 4 deletions opencompass/utils/logging.py
Original file line number Diff line number Diff line change
@@ -1,13 +1,78 @@
import logging
import os

from mmengine.logging import MMLogger

_nameToLevel = {
'CRITICAL': logging.CRITICAL,
'FATAL': logging.FATAL,
'ERROR': logging.ERROR,
'WARN': logging.WARNING,
'WARNING': logging.WARNING,
'INFO': logging.INFO,
'DEBUG': logging.DEBUG,
'NOTSET': logging.NOTSET,
}


def get_logger(log_level='INFO') -> MMLogger:
def get_logger(log_level='INFO', filter_duplicate_level=None) -> MMLogger:
"""Get the logger for OpenCompass.
Args:
log_level (str): The log level. Default: 'INFO'. Choices are 'DEBUG',
'INFO', 'WARNING', 'ERROR', 'CRITICAL'.
"""
return MMLogger.get_instance('OpenCompass',
logger_name='OpenCompass',
log_level=log_level)
logger = MMLogger.get_instance('OpenCompass',
logger_name='OpenCompass',
log_level=log_level)

if filter_duplicate_level is None:
# export OPENCOMPASS_FILTER_DUPLICATE_LEVEL=error
# export OPENCOMPASS_FILTER_DUPLICATE_LEVEL=error,warning
filter_duplicate_level = os.getenv(
'OPENCOMPASS_FILTER_DUPLICATE_LEVEL', None)

if filter_duplicate_level:
logger.addFilter(
FilterDuplicateMessage('OpenCompass', filter_duplicate_level))

return logger


class FilterDuplicateMessage(logging.Filter):
"""Filter the repeated message.
Args:
name (str): name of the filter.
"""

def __init__(self, name, filter_duplicate_level):
super().__init__(name)
self.seen: set = set()

if isinstance(filter_duplicate_level, str):
filter_duplicate_level = filter_duplicate_level.split(',')

self.filter_duplicate_level = []
for level in filter_duplicate_level:
_level = level.strip().upper()
if _level not in _nameToLevel:
raise ValueError(f'Invalid log level: {_level}')
self.filter_duplicate_level.append(_nameToLevel[_level])

def filter(self, record: logging.LogRecord) -> bool:
"""Filter the repeated error message.
Args:
record (LogRecord): The log record.
Returns:
bool: Whether to output the log record.
"""
if record.levelno not in self.filter_duplicate_level:
return True

if record.msg not in self.seen:
self.seen.add(record.msg)
return True
return False

0 comments on commit 488b7bd

Please sign in to comment.