import logging import unittest from collections import defaultdict from contextlib import contextmanager from pelican import log from pelican.tests.support import LogCountHandler class TestLog(unittest.TestCase): def setUp(self): super().setUp() self.logger = logging.getLogger(__name__) self.handler = LogCountHandler() self.logger.addHandler(self.handler) def tearDown(self): self._reset_limit_filter() super().tearDown() def _reset_limit_filter(self): log.LimitFilter._ignore = set() log.LimitFilter._raised_messages = set() log.LimitFilter._threshold = 5 log.LimitFilter._group_count = defaultdict(int) @contextmanager def reset_logger(self): try: yield None finally: self._reset_limit_filter() self.handler.flush() def test_log_filter(self): def do_logging(): for i in range(5): self.logger.warning("Log %s", i) self.logger.warning("Another log %s", i) # no filter with self.reset_logger(): do_logging() self.assertEqual(self.handler.count_logs("Log \\d", logging.WARNING), 5) self.assertEqual( self.handler.count_logs("Another log \\d", logging.WARNING), 5 ) # filter by template with self.reset_logger(): log.LimitFilter._ignore.add((logging.WARNING, "Log %s")) do_logging() self.assertEqual(self.handler.count_logs("Log \\d", logging.WARNING), 0) self.assertEqual( self.handler.count_logs("Another log \\d", logging.WARNING), 5 ) # filter by exact message with self.reset_logger(): log.LimitFilter._ignore.add((logging.WARNING, "Log 3")) do_logging() self.assertEqual(self.handler.count_logs("Log \\d", logging.WARNING), 4) self.assertEqual( self.handler.count_logs("Another log \\d", logging.WARNING), 5 ) # filter by both with self.reset_logger(): log.LimitFilter._ignore.add((logging.WARNING, "Log 3")) log.LimitFilter._ignore.add((logging.WARNING, "Another log %s")) do_logging() self.assertEqual(self.handler.count_logs("Log \\d", logging.WARNING), 4) self.assertEqual( self.handler.count_logs("Another log \\d", logging.WARNING), 0 )