def test_1(self): lcd = LCDictBasic(root_level='DEBUG', disable_existing_loggers=False) lcd.add_formatter( 'msg', format='%(message)s' ).add_formatter( 'process_msg', format='%(processName)-10s: %(message)s' ).add_formatter( 'logger_process_msg', format='%(name)-15s: %(processName)-10s: %(message)s' ) # lcd.dump() # | DEBUG comment out self.assertEqual(lcd, { 'version': 1, 'root': {'level': 'DEBUG', 'handlers': []}, 'loggers': {}, 'disable_existing_loggers': False, 'formatters': {'msg': {'format': '%(message)s'}, 'process_msg': {'format': '%(processName)-10s: %(message)s'}, 'logger_process_msg': {'format': '%(name)-15s: %(processName)-10s: %(message)s'} }, 'incremental': False, 'filters': {}, 'handlers': {} }) lcd.add_handler( 'console', class_='logging.StreamHandler', level='INFO', formatter='msg' ).add_file_handler( 'default_file', filename='blather.log', level='DEBUG', formatter='msg' ) # lcd.dump() # | DEBUG comment out self.assertEqual(lcd, { 'version': 1, 'root': {'level': 'DEBUG', 'handlers': []}, 'loggers': {}, 'disable_existing_loggers': False, 'incremental': False, 'formatters': {'msg': {'format': '%(message)s'}, 'process_msg': {'format': '%(processName)-10s: %(message)s'}, 'logger_process_msg': {'format': '%(name)-15s: %(processName)-10s: %(message)s'} }, 'filters': {}, 'handlers': {'console': {'formatter': 'msg', 'level': 'INFO', 'class': 'logging.StreamHandler'}, 'default_file': {'formatter': 'msg', 'level': 'DEBUG', 'class': 'logging.FileHandler', 'filename': 'blather.log', 'delay': False, 'mode': 'a'}} }) lcd.add_logger( 'default', handlers=('console', 'default_file'), level='DEBUG' ) lcd.set_logger_level('default', level='DEBUG') # coverage ho' # lcd.dump() # | DEBUG comment out self.assertEqual(lcd, { 'version': 1, 'root': {'level': 'DEBUG', 'handlers': []}, 'loggers': {'default': {'level': 'DEBUG', 'handlers': ['console', 'default_file']}}, 'disable_existing_loggers': False, 'incremental': False, 'formatters': {'msg': {'format': '%(message)s'}, 'process_msg': {'format': '%(processName)-10s: %(message)s'}, 'logger_process_msg': {'format': '%(name)-15s: %(processName)-10s: %(message)s'} }, 'filters': {}, 'handlers': {'console': {'formatter': 'msg', 'level': 'INFO', 'class': 'logging.StreamHandler'}, 'default_file': {'formatter': 'msg', 'level': 'DEBUG', 'class': 'logging.FileHandler', 'filename': 'blather.log', 'delay': False, 'mode': 'a'}} })
def test_filters_on_logger(self): def _count_debug(record): """ :param record: logging.LogRecord :return: bool -- True ==> let record through, False ==> squelch """ if record.levelno == logging.DEBUG: self.debug_count += 1 return True class CountInfo(logging.Filter): def filter(self_, record): """ :param self_: "self" for the CountInfo object (unused) :param record: logging.LogRecord :return: bool -- True ==> let record through, False ==> squelch """ if record.levelno == logging.INFO: self.info_count += 1 return True if PY2: # Note: If Python 2.x, filter can't be just # . any callable taking a logging record as arg; # . it must have an attribute .filter # . which must be a callable taking a LogRecord as arg. # . Typically one does this: _count_debug.filter = _count_debug lcd = LCDictBasic() lcd.set_root_level('DEBUG') lcd.add_formatter( 'msg', format='%(message)s' ).add_null_handler( 'console', level='INFO', ).set_handler_level( 'console', 'DEBUG') lcd.attach_root_handlers('console') lcd.add_filter( 'count_d', ** {'()': lambda: _count_debug } ).add_filter( 'count_i', ** {'()': CountInfo} ) lcd.add_logger('h', filters=['count_d', 'count_i']) # shameless bid for more coverage lcd.set_logger_level('h', level='DEBUG') lcd.config(disable_existing_loggers=False) logger = logging.getLogger('h') if PY2: logger.debug(u"Hi 1") logger.debug(u"Hi 2") logger.info(u"Hi 3") else: logger.debug("Hi 1") logger.debug("Hi 2") logger.info("Hi 3") self.assertEqual(self.debug_count, 2) self.assertEqual(self.info_count, 1)