mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 05:31:20 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			2234 lines
		
	
	
	
		
			78 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			2234 lines
		
	
	
	
		
			78 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| #!/usr/bin/env python
 | |
| """
 | |
| Test 0
 | |
| ======
 | |
| 
 | |
| Some preliminaries:
 | |
| >>> import sys
 | |
| >>> import logging
 | |
| >>> def nextmessage():
 | |
| ...    global msgcount
 | |
| ...    rv = "Message %d" % msgcount
 | |
| ...    msgcount = msgcount + 1
 | |
| ...    return rv
 | |
| 
 | |
| Set a few variables, then go through the logger autoconfig and set the default threshold.
 | |
| >>> msgcount = 0
 | |
| >>> FINISH_UP = "Finish up, it's closing time. Messages should bear numbers 0 through 24."
 | |
| >>> logging.basicConfig(stream=sys.stdout)
 | |
| >>> rootLogger = logging.getLogger("")
 | |
| >>> rootLogger.setLevel(logging.DEBUG)
 | |
| 
 | |
| Now, create a bunch of loggers, and set their thresholds.
 | |
| >>> ERR = logging.getLogger("ERR0")
 | |
| >>> ERR.setLevel(logging.ERROR)
 | |
| >>> INF = logging.getLogger("INFO0")
 | |
| >>> INF.setLevel(logging.INFO)
 | |
| >>> INF_ERR  = logging.getLogger("INFO0.ERR")
 | |
| >>> INF_ERR.setLevel(logging.ERROR)
 | |
| >>> DEB = logging.getLogger("DEB0")
 | |
| >>> DEB.setLevel(logging.DEBUG)
 | |
| >>> INF_UNDEF = logging.getLogger("INFO0.UNDEF")
 | |
| >>> INF_ERR_UNDEF = logging.getLogger("INFO0.ERR.UNDEF")
 | |
| >>> UNDEF = logging.getLogger("UNDEF0")
 | |
| >>> GRANDCHILD = logging.getLogger("INFO0.BADPARENT.UNDEF")
 | |
| >>> CHILD = logging.getLogger("INFO0.BADPARENT")
 | |
| 
 | |
| 
 | |
| And finally, run all the tests.
 | |
| 
 | |
| >>> ERR.log(logging.FATAL, nextmessage())
 | |
| CRITICAL:ERR0:Message 0
 | |
| 
 | |
| >>> ERR.error(nextmessage())
 | |
| ERROR:ERR0:Message 1
 | |
| 
 | |
| >>> INF.log(logging.FATAL, nextmessage())
 | |
| CRITICAL:INFO0:Message 2
 | |
| 
 | |
| >>> INF.error(nextmessage())
 | |
| ERROR:INFO0:Message 3
 | |
| 
 | |
| >>> INF.warn(nextmessage())
 | |
| WARNING:INFO0:Message 4
 | |
| 
 | |
| >>> INF.info(nextmessage())
 | |
| INFO:INFO0:Message 5
 | |
| 
 | |
| >>> INF_UNDEF.log(logging.FATAL, nextmessage())
 | |
| CRITICAL:INFO0.UNDEF:Message 6
 | |
| 
 | |
| >>> INF_UNDEF.error(nextmessage())
 | |
| ERROR:INFO0.UNDEF:Message 7
 | |
| 
 | |
| >>> INF_UNDEF.warn (nextmessage())
 | |
| WARNING:INFO0.UNDEF:Message 8
 | |
| 
 | |
| >>> INF_UNDEF.info (nextmessage())
 | |
| INFO:INFO0.UNDEF:Message 9
 | |
| 
 | |
| >>> INF_ERR.log(logging.FATAL, nextmessage())
 | |
| CRITICAL:INFO0.ERR:Message 10
 | |
| 
 | |
| >>> INF_ERR.error(nextmessage())
 | |
| ERROR:INFO0.ERR:Message 11
 | |
| 
 | |
| >>> INF_ERR_UNDEF.log(logging.FATAL, nextmessage())
 | |
| CRITICAL:INFO0.ERR.UNDEF:Message 12
 | |
| 
 | |
| >>> INF_ERR_UNDEF.error(nextmessage())
 | |
| ERROR:INFO0.ERR.UNDEF:Message 13
 | |
| 
 | |
| >>> DEB.log(logging.FATAL, nextmessage())
 | |
| CRITICAL:DEB0:Message 14
 | |
| 
 | |
| >>> DEB.error(nextmessage())
 | |
| ERROR:DEB0:Message 15
 | |
| 
 | |
| >>> DEB.warn (nextmessage())
 | |
| WARNING:DEB0:Message 16
 | |
| 
 | |
| >>> DEB.info (nextmessage())
 | |
| INFO:DEB0:Message 17
 | |
| 
 | |
| >>> DEB.debug(nextmessage())
 | |
| DEBUG:DEB0:Message 18
 | |
| 
 | |
| >>> UNDEF.log(logging.FATAL, nextmessage())
 | |
| CRITICAL:UNDEF0:Message 19
 | |
| 
 | |
| >>> UNDEF.error(nextmessage())
 | |
| ERROR:UNDEF0:Message 20
 | |
| 
 | |
| >>> UNDEF.warn (nextmessage())
 | |
| WARNING:UNDEF0:Message 21
 | |
| 
 | |
| >>> UNDEF.info (nextmessage())
 | |
| INFO:UNDEF0:Message 22
 | |
| 
 | |
| >>> GRANDCHILD.log(logging.FATAL, nextmessage())
 | |
| CRITICAL:INFO0.BADPARENT.UNDEF:Message 23
 | |
| 
 | |
| >>> CHILD.log(logging.FATAL, nextmessage())
 | |
| CRITICAL:INFO0.BADPARENT:Message 24
 | |
| 
 | |
| These should not log:
 | |
| 
 | |
| >>> ERR.warn(nextmessage())
 | |
| 
 | |
| >>> ERR.info(nextmessage())
 | |
| 
 | |
| >>> ERR.debug(nextmessage())
 | |
| 
 | |
| >>> INF.debug(nextmessage())
 | |
| 
 | |
| >>> INF_UNDEF.debug(nextmessage())
 | |
| 
 | |
| >>> INF_ERR.warn(nextmessage())
 | |
| 
 | |
| >>> INF_ERR.info(nextmessage())
 | |
| 
 | |
| >>> INF_ERR.debug(nextmessage())
 | |
| 
 | |
| >>> INF_ERR_UNDEF.warn(nextmessage())
 | |
| 
 | |
| >>> INF_ERR_UNDEF.info(nextmessage())
 | |
| 
 | |
| >>> INF_ERR_UNDEF.debug(nextmessage())
 | |
| 
 | |
| >>> INF.info(FINISH_UP)
 | |
| INFO:INFO0:Finish up, it's closing time. Messages should bear numbers 0 through 24.
 | |
| 
 | |
| Test 1
 | |
| ======
 | |
| 
 | |
| >>> import sys, logging
 | |
| >>> logging.basicConfig(stream=sys.stdout)
 | |
| 
 | |
| First, we define our levels. There can be as many as you want - the only
 | |
| limitations are that they should be integers, the lowest should be > 0 and
 | |
| larger values mean less information being logged. If you need specific
 | |
| level values which do not fit into these limitations, you can use a
 | |
| mapping dictionary to convert between your application levels and the
 | |
| logging system.
 | |
| 
 | |
| >>> SILENT      = 10
 | |
| >>> TACITURN    = 9
 | |
| >>> TERSE       = 8
 | |
| >>> EFFUSIVE    = 7
 | |
| >>> SOCIABLE    = 6
 | |
| >>> VERBOSE     = 5
 | |
| >>> TALKATIVE   = 4
 | |
| >>> GARRULOUS   = 3
 | |
| >>> CHATTERBOX  = 2
 | |
| >>> BORING      = 1
 | |
| >>> LEVEL_RANGE = range(BORING, SILENT + 1)
 | |
| 
 | |
| 
 | |
| Next, we define names for our levels. You don't need to do this - in which
 | |
|   case the system will use "Level n" to denote the text for the level.
 | |
| '
 | |
| 
 | |
| 
 | |
| >>> my_logging_levels = {
 | |
| ...     SILENT      : 'SILENT',
 | |
| ...     TACITURN    : 'TACITURN',
 | |
| ...     TERSE       : 'TERSE',
 | |
| ...     EFFUSIVE    : 'EFFUSIVE',
 | |
| ...     SOCIABLE    : 'SOCIABLE',
 | |
| ...     VERBOSE     : 'VERBOSE',
 | |
| ...     TALKATIVE   : 'TALKATIVE',
 | |
| ...     GARRULOUS   : 'GARRULOUS',
 | |
| ...     CHATTERBOX  : 'CHATTERBOX',
 | |
| ...     BORING      : 'BORING',
 | |
| ...     }
 | |
| 
 | |
| 
 | |
| Now, to demonstrate filtering: suppose for some perverse reason we only
 | |
| want to print out all except GARRULOUS messages. We create a filter for
 | |
| this purpose...
 | |
| 
 | |
| >>> class SpecificLevelFilter(logging.Filter):
 | |
| ...     def __init__(self, lvl):
 | |
| ...         self.level = lvl
 | |
| ...
 | |
| ...     def filter(self, record):
 | |
| ...         return self.level != record.levelno
 | |
| 
 | |
| >>> class GarrulousFilter(SpecificLevelFilter):
 | |
| ...     def __init__(self):
 | |
| ...         SpecificLevelFilter.__init__(self, GARRULOUS)
 | |
| 
 | |
| 
 | |
| Now, demonstrate filtering at the logger. This time, use a filter
 | |
| which excludes SOCIABLE and TACITURN messages. Note that GARRULOUS events
 | |
| are still excluded.
 | |
| 
 | |
| 
 | |
| >>> class VerySpecificFilter(logging.Filter):
 | |
| ...     def filter(self, record):
 | |
| ...         return record.levelno not in [SOCIABLE, TACITURN]
 | |
| 
 | |
| >>> SHOULD1 = "This should only be seen at the '%s' logging level (or lower)"
 | |
| 
 | |
| Configure the logger, and tell the logging system to associate names with our levels.
 | |
| >>> logging.basicConfig(stream=sys.stdout)
 | |
| >>> rootLogger = logging.getLogger("")
 | |
| >>> rootLogger.setLevel(logging.DEBUG)
 | |
| >>> for lvl in my_logging_levels.keys():
 | |
| ...    logging.addLevelName(lvl, my_logging_levels[lvl])
 | |
| >>> log = logging.getLogger("")
 | |
| >>> hdlr = log.handlers[0]
 | |
| >>> from test_logging import message
 | |
| 
 | |
| Set the logging level to each different value and call the utility
 | |
| function to log events. In the output, you should see that each time
 | |
| round the loop, the number of logging events which are actually output
 | |
| decreases.
 | |
| 
 | |
| >>> log.setLevel(1)
 | |
| 
 | |
| >>> log.log(1, "This should only be seen at the '%s' logging level (or lower)", BORING)
 | |
| BORING:root:This should only be seen at the '1' logging level (or lower)
 | |
| 
 | |
| >>> log.log(2, "This should only be seen at the '%s' logging level (or lower)", CHATTERBOX)
 | |
| CHATTERBOX:root:This should only be seen at the '2' logging level (or lower)
 | |
| 
 | |
| >>> log.log(3, "This should only be seen at the '%s' logging level (or lower)", GARRULOUS)
 | |
| GARRULOUS:root:This should only be seen at the '3' logging level (or lower)
 | |
| 
 | |
| >>> log.log(4, "This should only be seen at the '%s' logging level (or lower)", TALKATIVE)
 | |
| TALKATIVE:root:This should only be seen at the '4' logging level (or lower)
 | |
| 
 | |
| >>> log.log(5, "This should only be seen at the '%s' logging level (or lower)", VERBOSE)
 | |
| VERBOSE:root:This should only be seen at the '5' logging level (or lower)
 | |
| 
 | |
| >>> log.log(6, "This should only be seen at the '%s' logging level (or lower)", SOCIABLE)
 | |
| SOCIABLE:root:This should only be seen at the '6' logging level (or lower)
 | |
| 
 | |
| >>> log.log(7, "This should only be seen at the '%s' logging level (or lower)", EFFUSIVE)
 | |
| EFFUSIVE:root:This should only be seen at the '7' logging level (or lower)
 | |
| 
 | |
| >>> log.log(8, "This should only be seen at the '%s' logging level (or lower)", TERSE)
 | |
| TERSE:root:This should only be seen at the '8' logging level (or lower)
 | |
| 
 | |
| >>> log.log(9, "This should only be seen at the '%s' logging level (or lower)", TACITURN)
 | |
| TACITURN:root:This should only be seen at the '9' logging level (or lower)
 | |
| 
 | |
| >>> log.log(10, "This should only be seen at the '%s' logging level (or lower)", SILENT)
 | |
| SILENT:root:This should only be seen at the '10' logging level (or lower)
 | |
| 
 | |
| >>> log.setLevel(0)
 | |
| 
 | |
| >>> log.setLevel(2)
 | |
| 
 | |
| >>> log.log(1, "This should only be seen at the '%s' logging level (or lower)", BORING)
 | |
| 
 | |
| >>> log.log(2, "This should only be seen at the '%s' logging level (or lower)", CHATTERBOX)
 | |
| CHATTERBOX:root:This should only be seen at the '2' logging level (or lower)
 | |
| 
 | |
| >>> log.log(3, "This should only be seen at the '%s' logging level (or lower)", GARRULOUS)
 | |
| GARRULOUS:root:This should only be seen at the '3' logging level (or lower)
 | |
| 
 | |
| >>> log.log(4, "This should only be seen at the '%s' logging level (or lower)", TALKATIVE)
 | |
| TALKATIVE:root:This should only be seen at the '4' logging level (or lower)
 | |
| 
 | |
| >>> log.log(5, "This should only be seen at the '%s' logging level (or lower)", VERBOSE)
 | |
| VERBOSE:root:This should only be seen at the '5' logging level (or lower)
 | |
| 
 | |
| >>> log.log(6, "This should only be seen at the '%s' logging level (or lower)", SOCIABLE)
 | |
| SOCIABLE:root:This should only be seen at the '6' logging level (or lower)
 | |
| 
 | |
| >>> log.log(7, "This should only be seen at the '%s' logging level (or lower)", EFFUSIVE)
 | |
| EFFUSIVE:root:This should only be seen at the '7' logging level (or lower)
 | |
| 
 | |
| >>> log.log(8, "This should only be seen at the '%s' logging level (or lower)", TERSE)
 | |
| TERSE:root:This should only be seen at the '8' logging level (or lower)
 | |
| 
 | |
| >>> log.log(9, "This should only be seen at the '%s' logging level (or lower)", TACITURN)
 | |
| TACITURN:root:This should only be seen at the '9' logging level (or lower)
 | |
| 
 | |
| >>> log.log(10, "This should only be seen at the '%s' logging level (or lower)", SILENT)
 | |
| SILENT:root:This should only be seen at the '10' logging level (or lower)
 | |
| 
 | |
| >>> log.setLevel(3)
 | |
| 
 | |
| >>> log.log(1, "This should only be seen at the '%s' logging level (or lower)", BORING)
 | |
| 
 | |
| >>> log.log(2, "This should only be seen at the '%s' logging level (or lower)", CHATTERBOX)
 | |
| 
 | |
| >>> log.log(3, "This should only be seen at the '%s' logging level (or lower)", GARRULOUS)
 | |
| GARRULOUS:root:This should only be seen at the '3' logging level (or lower)
 | |
| 
 | |
| >>> log.log(4, "This should only be seen at the '%s' logging level (or lower)", TALKATIVE)
 | |
| TALKATIVE:root:This should only be seen at the '4' logging level (or lower)
 | |
| 
 | |
| >>> log.log(5, "This should only be seen at the '%s' logging level (or lower)", VERBOSE)
 | |
| VERBOSE:root:This should only be seen at the '5' logging level (or lower)
 | |
| 
 | |
| >>> log.log(6, "This should only be seen at the '%s' logging level (or lower)", SOCIABLE)
 | |
| SOCIABLE:root:This should only be seen at the '6' logging level (or lower)
 | |
| 
 | |
| >>> log.log(7, "This should only be seen at the '%s' logging level (or lower)", EFFUSIVE)
 | |
| EFFUSIVE:root:This should only be seen at the '7' logging level (or lower)
 | |
| 
 | |
| >>> log.log(8, "This should only be seen at the '%s' logging level (or lower)", TERSE)
 | |
| TERSE:root:This should only be seen at the '8' logging level (or lower)
 | |
| 
 | |
| >>> log.log(9, "This should only be seen at the '%s' logging level (or lower)", TACITURN)
 | |
| TACITURN:root:This should only be seen at the '9' logging level (or lower)
 | |
| 
 | |
| >>> log.log(10, "This should only be seen at the '%s' logging level (or lower)", SILENT)
 | |
| SILENT:root:This should only be seen at the '10' logging level (or lower)
 | |
| 
 | |
| >>> log.setLevel(4)
 | |
| 
 | |
| >>> log.log(1, "This should only be seen at the '%s' logging level (or lower)", BORING)
 | |
| 
 | |
| >>> log.log(2, "This should only be seen at the '%s' logging level (or lower)", CHATTERBOX)
 | |
| 
 | |
| >>> log.log(3, "This should only be seen at the '%s' logging level (or lower)", GARRULOUS)
 | |
| 
 | |
| >>> log.log(4, "This should only be seen at the '%s' logging level (or lower)", TALKATIVE)
 | |
| TALKATIVE:root:This should only be seen at the '4' logging level (or lower)
 | |
| 
 | |
| >>> log.log(5, "This should only be seen at the '%s' logging level (or lower)", VERBOSE)
 | |
| VERBOSE:root:This should only be seen at the '5' logging level (or lower)
 | |
| 
 | |
| >>> log.log(6, "This should only be seen at the '%s' logging level (or lower)", SOCIABLE)
 | |
| SOCIABLE:root:This should only be seen at the '6' logging level (or lower)
 | |
| 
 | |
| >>> log.log(7, "This should only be seen at the '%s' logging level (or lower)", EFFUSIVE)
 | |
| EFFUSIVE:root:This should only be seen at the '7' logging level (or lower)
 | |
| 
 | |
| >>> log.log(8, "This should only be seen at the '%s' logging level (or lower)", TERSE)
 | |
| TERSE:root:This should only be seen at the '8' logging level (or lower)
 | |
| 
 | |
| >>> log.log(9, "This should only be seen at the '%s' logging level (or lower)", TACITURN)
 | |
| TACITURN:root:This should only be seen at the '9' logging level (or lower)
 | |
| 
 | |
| >>> log.log(10, "This should only be seen at the '%s' logging level (or lower)", SILENT)
 | |
| SILENT:root:This should only be seen at the '10' logging level (or lower)
 | |
| 
 | |
| >>> log.setLevel(5)
 | |
| 
 | |
| >>> log.log(1, "This should only be seen at the '%s' logging level (or lower)", BORING)
 | |
| 
 | |
| >>> log.log(2, "This should only be seen at the '%s' logging level (or lower)", CHATTERBOX)
 | |
| 
 | |
| >>> log.log(3, "This should only be seen at the '%s' logging level (or lower)", GARRULOUS)
 | |
| 
 | |
| >>> log.log(4, "This should only be seen at the '%s' logging level (or lower)", TALKATIVE)
 | |
| 
 | |
| >>> log.log(5, "This should only be seen at the '%s' logging level (or lower)", VERBOSE)
 | |
| VERBOSE:root:This should only be seen at the '5' logging level (or lower)
 | |
| 
 | |
| >>> log.log(6, "This should only be seen at the '%s' logging level (or lower)", SOCIABLE)
 | |
| SOCIABLE:root:This should only be seen at the '6' logging level (or lower)
 | |
| 
 | |
| >>> log.log(7, "This should only be seen at the '%s' logging level (or lower)", EFFUSIVE)
 | |
| EFFUSIVE:root:This should only be seen at the '7' logging level (or lower)
 | |
| 
 | |
| >>> log.log(8, "This should only be seen at the '%s' logging level (or lower)", TERSE)
 | |
| TERSE:root:This should only be seen at the '8' logging level (or lower)
 | |
| 
 | |
| >>> log.log(9, "This should only be seen at the '%s' logging level (or lower)", TACITURN)
 | |
| TACITURN:root:This should only be seen at the '9' logging level (or lower)
 | |
| 
 | |
| >>> log.log(10, "This should only be seen at the '%s' logging level (or lower)", SILENT)
 | |
| SILENT:root:This should only be seen at the '10' logging level (or lower)
 | |
| 
 | |
| 
 | |
| >>> log.setLevel(6)
 | |
| 
 | |
| >>> log.log(1, "This should only be seen at the '%s' logging level (or lower)", BORING)
 | |
| 
 | |
| >>> log.log(2, "This should only be seen at the '%s' logging level (or lower)", CHATTERBOX)
 | |
| 
 | |
| >>> log.log(3, "This should only be seen at the '%s' logging level (or lower)", GARRULOUS)
 | |
| 
 | |
| >>> log.log(4, "This should only be seen at the '%s' logging level (or lower)", TALKATIVE)
 | |
| 
 | |
| >>> log.log(5, "This should only be seen at the '%s' logging level (or lower)", VERBOSE)
 | |
| 
 | |
| >>> log.log(6, "This should only be seen at the '%s' logging level (or lower)", SOCIABLE)
 | |
| SOCIABLE:root:This should only be seen at the '6' logging level (or lower)
 | |
| 
 | |
| >>> log.log(7, "This should only be seen at the '%s' logging level (or lower)", EFFUSIVE)
 | |
| EFFUSIVE:root:This should only be seen at the '7' logging level (or lower)
 | |
| 
 | |
| >>> log.log(8, "This should only be seen at the '%s' logging level (or lower)", TERSE)
 | |
| TERSE:root:This should only be seen at the '8' logging level (or lower)
 | |
| 
 | |
| >>> log.log(9, "This should only be seen at the '%s' logging level (or lower)", TACITURN)
 | |
| TACITURN:root:This should only be seen at the '9' logging level (or lower)
 | |
| 
 | |
| >>> log.log(10, "This should only be seen at the '%s' logging level (or lower)", SILENT)
 | |
| SILENT:root:This should only be seen at the '10' logging level (or lower)
 | |
| 
 | |
| >>> log.setLevel(7)
 | |
| 
 | |
| >>> log.log(1, "This should only be seen at the '%s' logging level (or lower)", BORING)
 | |
| 
 | |
| >>> log.log(2, "This should only be seen at the '%s' logging level (or lower)", CHATTERBOX)
 | |
| 
 | |
| >>> log.log(3, "This should only be seen at the '%s' logging level (or lower)", GARRULOUS)
 | |
| 
 | |
| >>> log.log(4, "This should only be seen at the '%s' logging level (or lower)", TALKATIVE)
 | |
| 
 | |
| >>> log.log(5, "This should only be seen at the '%s' logging level (or lower)", VERBOSE)
 | |
| 
 | |
| >>> log.log(6, "This should only be seen at the '%s' logging level (or lower)", SOCIABLE)
 | |
| 
 | |
| >>> log.log(7, "This should only be seen at the '%s' logging level (or lower)", EFFUSIVE)
 | |
| EFFUSIVE:root:This should only be seen at the '7' logging level (or lower)
 | |
| 
 | |
| >>> log.log(8, "This should only be seen at the '%s' logging level (or lower)", TERSE)
 | |
| TERSE:root:This should only be seen at the '8' logging level (or lower)
 | |
| 
 | |
| >>> log.log(9, "This should only be seen at the '%s' logging level (or lower)", TACITURN)
 | |
| TACITURN:root:This should only be seen at the '9' logging level (or lower)
 | |
| 
 | |
| >>> log.log(10, "This should only be seen at the '%s' logging level (or lower)", SILENT)
 | |
| SILENT:root:This should only be seen at the '10' logging level (or lower)
 | |
| 
 | |
| >>> log.setLevel(8)
 | |
| 
 | |
| >>> log.log(1, "This should only be seen at the '%s' logging level (or lower)", BORING)
 | |
| 
 | |
| >>> log.log(2, "This should only be seen at the '%s' logging level (or lower)", CHATTERBOX)
 | |
| 
 | |
| >>> log.log(3, "This should only be seen at the '%s' logging level (or lower)", GARRULOUS)
 | |
| 
 | |
| >>> log.log(4, "This should only be seen at the '%s' logging level (or lower)", TALKATIVE)
 | |
| 
 | |
| >>> log.log(5, "This should only be seen at the '%s' logging level (or lower)", VERBOSE)
 | |
| 
 | |
| >>> log.log(6, "This should only be seen at the '%s' logging level (or lower)", SOCIABLE)
 | |
| 
 | |
| >>> log.log(7, "This should only be seen at the '%s' logging level (or lower)", EFFUSIVE)
 | |
| 
 | |
| >>> log.log(8, "This should only be seen at the '%s' logging level (or lower)", TERSE)
 | |
| TERSE:root:This should only be seen at the '8' logging level (or lower)
 | |
| 
 | |
| >>> log.log(9, "This should only be seen at the '%s' logging level (or lower)", TACITURN)
 | |
| TACITURN:root:This should only be seen at the '9' logging level (or lower)
 | |
| 
 | |
| >>> log.log(10, "This should only be seen at the '%s' logging level (or lower)", SILENT)
 | |
| SILENT:root:This should only be seen at the '10' logging level (or lower)
 | |
| 
 | |
| >>> log.setLevel(0)
 | |
| 
 | |
| >>> log.setLevel(9)
 | |
| 
 | |
| >>> log.log(1, "This should only be seen at the '%s' logging level (or lower)", BORING)
 | |
| 
 | |
| >>> log.log(2, "This should only be seen at the '%s' logging level (or lower)", CHATTERBOX)
 | |
| 
 | |
| >>> log.log(3, "This should only be seen at the '%s' logging level (or lower)", GARRULOUS)
 | |
| 
 | |
| >>> log.log(4, "This should only be seen at the '%s' logging level (or lower)", TALKATIVE)
 | |
| 
 | |
| >>> log.log(5, "This should only be seen at the '%s' logging level (or lower)", VERBOSE)
 | |
| 
 | |
| >>> log.log(6, "This should only be seen at the '%s' logging level (or lower)", SOCIABLE)
 | |
| 
 | |
| >>> log.log(7, "This should only be seen at the '%s' logging level (or lower)", EFFUSIVE)
 | |
| 
 | |
| >>> log.log(8, "This should only be seen at the '%s' logging level (or lower)", TERSE)
 | |
| 
 | |
| >>> log.log(9, "This should only be seen at the '%s' logging level (or lower)", TACITURN)
 | |
| TACITURN:root:This should only be seen at the '9' logging level (or lower)
 | |
| 
 | |
| >>> log.log(10, "This should only be seen at the '%s' logging level (or lower)", SILENT)
 | |
| SILENT:root:This should only be seen at the '10' logging level (or lower)
 | |
| 
 | |
| >>> log.setLevel(0)
 | |
| 
 | |
| >>> log.setLevel(10)
 | |
| 
 | |
| >>> log.log(1, "This should only be seen at the '%s' logging level (or lower)", BORING)
 | |
| 
 | |
| >>> log.log(2, "This should only be seen at the '%s' logging level (or lower)", CHATTERBOX)
 | |
| 
 | |
| >>> log.log(3, "This should only be seen at the '%s' logging level (or lower)", GARRULOUS)
 | |
| 
 | |
| >>> log.log(4, "This should only be seen at the '%s' logging level (or lower)", TALKATIVE)
 | |
| 
 | |
| >>> log.log(5, "This should only be seen at the '%s' logging level (or lower)", VERBOSE)
 | |
| 
 | |
| >>> log.log(6, "This should only be seen at the '%s' logging level (or lower)", SOCIABLE)
 | |
| 
 | |
| >>> log.log(7, "This should only be seen at the '%s' logging level (or lower)", EFFUSIVE)
 | |
| 
 | |
| >>> log.log(8, "This should only be seen at the '%s' logging level (or lower)", TERSE)
 | |
| 
 | |
| >>> log.log(9, "This should only be seen at the '%s' logging level (or lower)", TACITURN)
 | |
| 
 | |
| >>> log.log(10, "This should only be seen at the '%s' logging level (or lower)", SILENT)
 | |
| SILENT:root:This should only be seen at the '10' logging level (or lower)
 | |
| 
 | |
| >>> hdlr.setLevel(SOCIABLE)
 | |
| 
 | |
| >>> log.setLevel(1)
 | |
| 
 | |
| >>> log.log(1, "This should only be seen at the '%s' logging level (or lower)", BORING)
 | |
| 
 | |
| >>> log.log(2, "This should only be seen at the '%s' logging level (or lower)", CHATTERBOX)
 | |
| 
 | |
| >>> log.log(3, "This should only be seen at the '%s' logging level (or lower)", GARRULOUS)
 | |
| 
 | |
| >>> log.log(4, "This should only be seen at the '%s' logging level (or lower)", TALKATIVE)
 | |
| 
 | |
| >>> log.log(5, "This should only be seen at the '%s' logging level (or lower)", VERBOSE)
 | |
| 
 | |
| >>> log.log(6, "This should only be seen at the '%s' logging level (or lower)", SOCIABLE)
 | |
| SOCIABLE:root:This should only be seen at the '6' logging level (or lower)
 | |
| 
 | |
| >>> log.log(7, "This should only be seen at the '%s' logging level (or lower)", EFFUSIVE)
 | |
| EFFUSIVE:root:This should only be seen at the '7' logging level (or lower)
 | |
| 
 | |
| >>> log.log(8, "This should only be seen at the '%s' logging level (or lower)", TERSE)
 | |
| TERSE:root:This should only be seen at the '8' logging level (or lower)
 | |
| 
 | |
| >>> log.log(9, "This should only be seen at the '%s' logging level (or lower)", TACITURN)
 | |
| TACITURN:root:This should only be seen at the '9' logging level (or lower)
 | |
| 
 | |
| >>> log.log(10, "This should only be seen at the '%s' logging level (or lower)", SILENT)
 | |
| SILENT:root:This should only be seen at the '10' logging level (or lower)
 | |
| 
 | |
| >>> log.setLevel(2)
 | |
| 
 | |
| >>> log.log(1, "This should only be seen at the '%s' logging level (or lower)", BORING)
 | |
| 
 | |
| >>> log.log(2, "This should only be seen at the '%s' logging level (or lower)", CHATTERBOX)
 | |
| 
 | |
| >>> log.log(3, "This should only be seen at the '%s' logging level (or lower)", GARRULOUS)
 | |
| 
 | |
| >>> log.log(4, "This should only be seen at the '%s' logging level (or lower)", TALKATIVE)
 | |
| 
 | |
| >>> log.log(5, "This should only be seen at the '%s' logging level (or lower)", VERBOSE)
 | |
| 
 | |
| >>> log.log(6, "This should only be seen at the '%s' logging level (or lower)", SOCIABLE)
 | |
| SOCIABLE:root:This should only be seen at the '6' logging level (or lower)
 | |
| 
 | |
| >>> log.log(7, "This should only be seen at the '%s' logging level (or lower)", EFFUSIVE)
 | |
| EFFUSIVE:root:This should only be seen at the '7' logging level (or lower)
 | |
| 
 | |
| >>> log.log(8, "This should only be seen at the '%s' logging level (or lower)", TERSE)
 | |
| TERSE:root:This should only be seen at the '8' logging level (or lower)
 | |
| 
 | |
| >>> log.log(9, "This should only be seen at the '%s' logging level (or lower)", TACITURN)
 | |
| TACITURN:root:This should only be seen at the '9' logging level (or lower)
 | |
| 
 | |
| >>> log.log(10, "This should only be seen at the '%s' logging level (or lower)", SILENT)
 | |
| SILENT:root:This should only be seen at the '10' logging level (or lower)
 | |
| 
 | |
| >>> log.setLevel(3)
 | |
| 
 | |
| >>> log.log(1, "This should only be seen at the '%s' logging level (or lower)", BORING)
 | |
| 
 | |
| >>> log.log(2, "This should only be seen at the '%s' logging level (or lower)", CHATTERBOX)
 | |
| 
 | |
| >>> log.log(3, "This should only be seen at the '%s' logging level (or lower)", GARRULOUS)
 | |
| 
 | |
| >>> log.log(4, "This should only be seen at the '%s' logging level (or lower)", TALKATIVE)
 | |
| 
 | |
| >>> log.log(5, "This should only be seen at the '%s' logging level (or lower)", VERBOSE)
 | |
| 
 | |
| >>> log.log(6, "This should only be seen at the '%s' logging level (or lower)", SOCIABLE)
 | |
| SOCIABLE:root:This should only be seen at the '6' logging level (or lower)
 | |
| 
 | |
| >>> log.log(7, "This should only be seen at the '%s' logging level (or lower)", EFFUSIVE)
 | |
| EFFUSIVE:root:This should only be seen at the '7' logging level (or lower)
 | |
| 
 | |
| >>> log.log(8, "This should only be seen at the '%s' logging level (or lower)", TERSE)
 | |
| TERSE:root:This should only be seen at the '8' logging level (or lower)
 | |
| 
 | |
| >>> log.log(9, "This should only be seen at the '%s' logging level (or lower)", TACITURN)
 | |
| TACITURN:root:This should only be seen at the '9' logging level (or lower)
 | |
| 
 | |
| >>> log.log(10, "This should only be seen at the '%s' logging level (or lower)", SILENT)
 | |
| SILENT:root:This should only be seen at the '10' logging level (or lower)
 | |
| 
 | |
| >>> log.setLevel(0)
 | |
| 
 | |
| >>> log.setLevel(4)
 | |
| 
 | |
| >>> log.log(1, "This should only be seen at the '%s' logging level (or lower)", BORING)
 | |
| 
 | |
| >>> log.log(2, "This should only be seen at the '%s' logging level (or lower)", CHATTERBOX)
 | |
| 
 | |
| >>> log.log(3, "This should only be seen at the '%s' logging level (or lower)", GARRULOUS)
 | |
| 
 | |
| >>> log.log(4, "This should only be seen at the '%s' logging level (or lower)", TALKATIVE)
 | |
| 
 | |
| >>> log.log(5, "This should only be seen at the '%s' logging level (or lower)", VERBOSE)
 | |
| 
 | |
| >>> log.log(6, "This should only be seen at the '%s' logging level (or lower)", SOCIABLE)
 | |
| SOCIABLE:root:This should only be seen at the '6' logging level (or lower)
 | |
| 
 | |
| >>> log.log(7, "This should only be seen at the '%s' logging level (or lower)", EFFUSIVE)
 | |
| EFFUSIVE:root:This should only be seen at the '7' logging level (or lower)
 | |
| 
 | |
| >>> log.log(8, "This should only be seen at the '%s' logging level (or lower)", TERSE)
 | |
| TERSE:root:This should only be seen at the '8' logging level (or lower)
 | |
| 
 | |
| >>> log.log(9, "This should only be seen at the '%s' logging level (or lower)", TACITURN)
 | |
| TACITURN:root:This should only be seen at the '9' logging level (or lower)
 | |
| 
 | |
| >>> log.log(10, "This should only be seen at the '%s' logging level (or lower)", SILENT)
 | |
| SILENT:root:This should only be seen at the '10' logging level (or lower)
 | |
| 
 | |
| >>> log.setLevel(0)
 | |
| 
 | |
| >>> log.setLevel(5)
 | |
| 
 | |
| >>> log.log(1, "This should only be seen at the '%s' logging level (or lower)", BORING)
 | |
| 
 | |
| >>> log.log(2, "This should only be seen at the '%s' logging level (or lower)", CHATTERBOX)
 | |
| 
 | |
| >>> log.log(3, "This should only be seen at the '%s' logging level (or lower)", GARRULOUS)
 | |
| 
 | |
| >>> log.log(4, "This should only be seen at the '%s' logging level (or lower)", TALKATIVE)
 | |
| 
 | |
| >>> log.log(5, "This should only be seen at the '%s' logging level (or lower)", VERBOSE)
 | |
| 
 | |
| >>> log.log(6, "This should only be seen at the '%s' logging level (or lower)", SOCIABLE)
 | |
| SOCIABLE:root:This should only be seen at the '6' logging level (or lower)
 | |
| 
 | |
| >>> log.log(7, "This should only be seen at the '%s' logging level (or lower)", EFFUSIVE)
 | |
| EFFUSIVE:root:This should only be seen at the '7' logging level (or lower)
 | |
| 
 | |
| >>> log.log(8, "This should only be seen at the '%s' logging level (or lower)", TERSE)
 | |
| TERSE:root:This should only be seen at the '8' logging level (or lower)
 | |
| 
 | |
| >>> log.log(9, "This should only be seen at the '%s' logging level (or lower)", TACITURN)
 | |
| TACITURN:root:This should only be seen at the '9' logging level (or lower)
 | |
| 
 | |
| >>> log.log(10, "This should only be seen at the '%s' logging level (or lower)", SILENT)
 | |
| SILENT:root:This should only be seen at the '10' logging level (or lower)
 | |
| 
 | |
| >>> log.setLevel(0)
 | |
| 
 | |
| >>> log.setLevel(6)
 | |
| 
 | |
| >>> log.log(1, "This should only be seen at the '%s' logging level (or lower)", BORING)
 | |
| 
 | |
| >>> log.log(2, "This should only be seen at the '%s' logging level (or lower)", CHATTERBOX)
 | |
| 
 | |
| >>> log.log(3, "This should only be seen at the '%s' logging level (or lower)", GARRULOUS)
 | |
| 
 | |
| >>> log.log(4, "This should only be seen at the '%s' logging level (or lower)", TALKATIVE)
 | |
| 
 | |
| >>> log.log(5, "This should only be seen at the '%s' logging level (or lower)", VERBOSE)
 | |
| 
 | |
| >>> log.log(6, "This should only be seen at the '%s' logging level (or lower)", SOCIABLE)
 | |
| SOCIABLE:root:This should only be seen at the '6' logging level (or lower)
 | |
| 
 | |
| >>> log.log(7, "This should only be seen at the '%s' logging level (or lower)", EFFUSIVE)
 | |
| EFFUSIVE:root:This should only be seen at the '7' logging level (or lower)
 | |
| 
 | |
| >>> log.log(8, "This should only be seen at the '%s' logging level (or lower)", TERSE)
 | |
| TERSE:root:This should only be seen at the '8' logging level (or lower)
 | |
| 
 | |
| >>> log.log(9, "This should only be seen at the '%s' logging level (or lower)", TACITURN)
 | |
| TACITURN:root:This should only be seen at the '9' logging level (or lower)
 | |
| 
 | |
| >>> log.log(10, "This should only be seen at the '%s' logging level (or lower)", SILENT)
 | |
| SILENT:root:This should only be seen at the '10' logging level (or lower)
 | |
| 
 | |
| >>> log.setLevel(0)
 | |
| 
 | |
| >>> log.setLevel(7)
 | |
| 
 | |
| >>> log.log(1, "This should only be seen at the '%s' logging level (or lower)", BORING)
 | |
| 
 | |
| >>> log.log(2, "This should only be seen at the '%s' logging level (or lower)", CHATTERBOX)
 | |
| 
 | |
| >>> log.log(3, "This should only be seen at the '%s' logging level (or lower)", GARRULOUS)
 | |
| 
 | |
| >>> log.log(4, "This should only be seen at the '%s' logging level (or lower)", TALKATIVE)
 | |
| 
 | |
| >>> log.log(5, "This should only be seen at the '%s' logging level (or lower)", VERBOSE)
 | |
| 
 | |
| >>> log.log(6, "This should only be seen at the '%s' logging level (or lower)", SOCIABLE)
 | |
| 
 | |
| >>> log.log(7, "This should only be seen at the '%s' logging level (or lower)", EFFUSIVE)
 | |
| EFFUSIVE:root:This should only be seen at the '7' logging level (or lower)
 | |
| 
 | |
| >>> log.log(8, "This should only be seen at the '%s' logging level (or lower)", TERSE)
 | |
| TERSE:root:This should only be seen at the '8' logging level (or lower)
 | |
| 
 | |
| >>> log.log(9, "This should only be seen at the '%s' logging level (or lower)", TACITURN)
 | |
| TACITURN:root:This should only be seen at the '9' logging level (or lower)
 | |
| 
 | |
| >>> log.log(10, "This should only be seen at the '%s' logging level (or lower)", SILENT)
 | |
| SILENT:root:This should only be seen at the '10' logging level (or lower)
 | |
| 
 | |
| >>> log.setLevel(0)
 | |
| 
 | |
| >>> log.setLevel(8)
 | |
| 
 | |
| >>> log.log(1, "This should only be seen at the '%s' logging level (or lower)", BORING)
 | |
| 
 | |
| >>> log.log(2, "This should only be seen at the '%s' logging level (or lower)", CHATTERBOX)
 | |
| 
 | |
| >>> log.log(3, "This should only be seen at the '%s' logging level (or lower)", GARRULOUS)
 | |
| 
 | |
| >>> log.log(4, "This should only be seen at the '%s' logging level (or lower)", TALKATIVE)
 | |
| 
 | |
| >>> log.log(5, "This should only be seen at the '%s' logging level (or lower)", VERBOSE)
 | |
| 
 | |
| >>> log.log(6, "This should only be seen at the '%s' logging level (or lower)", SOCIABLE)
 | |
| 
 | |
| >>> log.log(7, "This should only be seen at the '%s' logging level (or lower)", EFFUSIVE)
 | |
| 
 | |
| >>> log.log(8, "This should only be seen at the '%s' logging level (or lower)", TERSE)
 | |
| TERSE:root:This should only be seen at the '8' logging level (or lower)
 | |
| 
 | |
| >>> log.log(9, "This should only be seen at the '%s' logging level (or lower)", TACITURN)
 | |
| TACITURN:root:This should only be seen at the '9' logging level (or lower)
 | |
| 
 | |
| >>> log.log(10, "This should only be seen at the '%s' logging level (or lower)", SILENT)
 | |
| SILENT:root:This should only be seen at the '10' logging level (or lower)
 | |
| 
 | |
| >>> log.setLevel(0)
 | |
| 
 | |
| >>> log.setLevel(9)
 | |
| 
 | |
| >>> log.log(1, "This should only be seen at the '%s' logging level (or lower)", BORING)
 | |
| 
 | |
| >>> log.log(2, "This should only be seen at the '%s' logging level (or lower)", CHATTERBOX)
 | |
| 
 | |
| >>> log.log(3, "This should only be seen at the '%s' logging level (or lower)", GARRULOUS)
 | |
| 
 | |
| >>> log.log(4, "This should only be seen at the '%s' logging level (or lower)", TALKATIVE)
 | |
| 
 | |
| >>> log.log(5, "This should only be seen at the '%s' logging level (or lower)", VERBOSE)
 | |
| 
 | |
| >>> log.log(6, "This should only be seen at the '%s' logging level (or lower)", SOCIABLE)
 | |
| 
 | |
| >>> log.log(7, "This should only be seen at the '%s' logging level (or lower)", EFFUSIVE)
 | |
| 
 | |
| >>> log.log(8, "This should only be seen at the '%s' logging level (or lower)", TERSE)
 | |
| 
 | |
| >>> log.log(9, "This should only be seen at the '%s' logging level (or lower)", TACITURN)
 | |
| TACITURN:root:This should only be seen at the '9' logging level (or lower)
 | |
| 
 | |
| >>> log.log(10, "This should only be seen at the '%s' logging level (or lower)", SILENT)
 | |
| SILENT:root:This should only be seen at the '10' logging level (or lower)
 | |
| 
 | |
| >>> log.setLevel(0)
 | |
| 
 | |
| >>> log.setLevel(10)
 | |
| 
 | |
| >>> log.log(1, "This should only be seen at the '%s' logging level (or lower)", BORING)
 | |
| 
 | |
| >>> log.log(2, "This should only be seen at the '%s' logging level (or lower)", CHATTERBOX)
 | |
| 
 | |
| >>> log.log(3, "This should only be seen at the '%s' logging level (or lower)", GARRULOUS)
 | |
| 
 | |
| >>> log.log(4, "This should only be seen at the '%s' logging level (or lower)", TALKATIVE)
 | |
| 
 | |
| >>> log.log(5, "This should only be seen at the '%s' logging level (or lower)", VERBOSE)
 | |
| 
 | |
| >>> log.log(6, "This should only be seen at the '%s' logging level (or lower)", SOCIABLE)
 | |
| 
 | |
| >>> log.log(7, "This should only be seen at the '%s' logging level (or lower)", EFFUSIVE)
 | |
| 
 | |
| >>> log.log(8, "This should only be seen at the '%s' logging level (or lower)", TERSE)
 | |
| 
 | |
| >>> log.log(9, "This should only be seen at the '%s' logging level (or lower)", TACITURN)
 | |
| 
 | |
| >>> log.log(10, "This should only be seen at the '%s' logging level (or lower)", SILENT)
 | |
| SILENT:root:This should only be seen at the '10' logging level (or lower)
 | |
| 
 | |
| >>> log.setLevel(0)
 | |
| 
 | |
| >>>
 | |
| 
 | |
| >>> hdlr.setLevel(0)
 | |
| 
 | |
| >>> garr = GarrulousFilter()
 | |
| 
 | |
| >>> hdlr.addFilter(garr)
 | |
| 
 | |
| >>> log.setLevel(1)
 | |
| 
 | |
| >>> log.log(1, "This should only be seen at the '%s' logging level (or lower)", BORING)
 | |
| BORING:root:This should only be seen at the '1' logging level (or lower)
 | |
| 
 | |
| >>> log.log(2, "This should only be seen at the '%s' logging level (or lower)", CHATTERBOX)
 | |
| CHATTERBOX:root:This should only be seen at the '2' logging level (or lower)
 | |
| 
 | |
| >>> log.log(3, "This should only be seen at the '%s' logging level (or lower)", GARRULOUS)
 | |
| 
 | |
| >>> log.log(4, "This should only be seen at the '%s' logging level (or lower)", TALKATIVE)
 | |
| TALKATIVE:root:This should only be seen at the '4' logging level (or lower)
 | |
| 
 | |
| >>> log.log(5, "This should only be seen at the '%s' logging level (or lower)", VERBOSE)
 | |
| VERBOSE:root:This should only be seen at the '5' logging level (or lower)
 | |
| 
 | |
| >>> log.log(6, "This should only be seen at the '%s' logging level (or lower)", SOCIABLE)
 | |
| SOCIABLE:root:This should only be seen at the '6' logging level (or lower)
 | |
| 
 | |
| >>> log.log(7, "This should only be seen at the '%s' logging level (or lower)", EFFUSIVE)
 | |
| EFFUSIVE:root:This should only be seen at the '7' logging level (or lower)
 | |
| 
 | |
| >>> log.log(8, "This should only be seen at the '%s' logging level (or lower)", TERSE)
 | |
| TERSE:root:This should only be seen at the '8' logging level (or lower)
 | |
| 
 | |
| >>> log.log(9, "This should only be seen at the '%s' logging level (or lower)", TACITURN)
 | |
| TACITURN:root:This should only be seen at the '9' logging level (or lower)
 | |
| 
 | |
| >>> log.log(10, "This should only be seen at the '%s' logging level (or lower)", SILENT)
 | |
| SILENT:root:This should only be seen at the '10' logging level (or lower)
 | |
| 
 | |
| >>> log.setLevel(2)
 | |
| 
 | |
| >>> log.log(1, "This should only be seen at the '%s' logging level (or lower)", BORING)
 | |
| 
 | |
| >>> log.log(2, "This should only be seen at the '%s' logging level (or lower)", CHATTERBOX)
 | |
| CHATTERBOX:root:This should only be seen at the '2' logging level (or lower)
 | |
| 
 | |
| >>> log.log(3, "This should only be seen at the '%s' logging level (or lower)", GARRULOUS)
 | |
| 
 | |
| >>> log.log(4, "This should only be seen at the '%s' logging level (or lower)", TALKATIVE)
 | |
| TALKATIVE:root:This should only be seen at the '4' logging level (or lower)
 | |
| 
 | |
| >>> log.log(5, "This should only be seen at the '%s' logging level (or lower)", VERBOSE)
 | |
| VERBOSE:root:This should only be seen at the '5' logging level (or lower)
 | |
| 
 | |
| >>> log.log(6, "This should only be seen at the '%s' logging level (or lower)", SOCIABLE)
 | |
| SOCIABLE:root:This should only be seen at the '6' logging level (or lower)
 | |
| 
 | |
| >>> log.log(7, "This should only be seen at the '%s' logging level (or lower)", EFFUSIVE)
 | |
| EFFUSIVE:root:This should only be seen at the '7' logging level (or lower)
 | |
| 
 | |
| >>> log.log(8, "This should only be seen at the '%s' logging level (or lower)", TERSE)
 | |
| TERSE:root:This should only be seen at the '8' logging level (or lower)
 | |
| 
 | |
| >>> log.log(9, "This should only be seen at the '%s' logging level (or lower)", TACITURN)
 | |
| TACITURN:root:This should only be seen at the '9' logging level (or lower)
 | |
| 
 | |
| >>> log.log(10, "This should only be seen at the '%s' logging level (or lower)", SILENT)
 | |
| SILENT:root:This should only be seen at the '10' logging level (or lower)
 | |
| 
 | |
| >>> log.setLevel(3)
 | |
| 
 | |
| >>> log.log(1, "This should only be seen at the '%s' logging level (or lower)", BORING)
 | |
| 
 | |
| >>> log.log(2, "This should only be seen at the '%s' logging level (or lower)", CHATTERBOX)
 | |
| 
 | |
| >>> log.log(3, "This should only be seen at the '%s' logging level (or lower)", GARRULOUS)
 | |
| 
 | |
| >>> log.log(4, "This should only be seen at the '%s' logging level (or lower)", TALKATIVE)
 | |
| TALKATIVE:root:This should only be seen at the '4' logging level (or lower)
 | |
| 
 | |
| >>> log.log(5, "This should only be seen at the '%s' logging level (or lower)", VERBOSE)
 | |
| VERBOSE:root:This should only be seen at the '5' logging level (or lower)
 | |
| 
 | |
| >>> log.log(6, "This should only be seen at the '%s' logging level (or lower)", SOCIABLE)
 | |
| SOCIABLE:root:This should only be seen at the '6' logging level (or lower)
 | |
| 
 | |
| >>> log.log(7, "This should only be seen at the '%s' logging level (or lower)", EFFUSIVE)
 | |
| EFFUSIVE:root:This should only be seen at the '7' logging level (or lower)
 | |
| 
 | |
| >>> log.log(8, "This should only be seen at the '%s' logging level (or lower)", TERSE)
 | |
| TERSE:root:This should only be seen at the '8' logging level (or lower)
 | |
| 
 | |
| >>> log.log(9, "This should only be seen at the '%s' logging level (or lower)", TACITURN)
 | |
| TACITURN:root:This should only be seen at the '9' logging level (or lower)
 | |
| 
 | |
| >>> log.log(10, "This should only be seen at the '%s' logging level (or lower)", SILENT)
 | |
| SILENT:root:This should only be seen at the '10' logging level (or lower)
 | |
| 
 | |
| >>> log.setLevel(4)
 | |
| 
 | |
| >>> log.log(1, "This should only be seen at the '%s' logging level (or lower)", BORING)
 | |
| 
 | |
| >>> log.log(2, "This should only be seen at the '%s' logging level (or lower)", CHATTERBOX)
 | |
| 
 | |
| >>> log.log(3, "This should only be seen at the '%s' logging level (or lower)", GARRULOUS)
 | |
| 
 | |
| >>> log.log(4, "This should only be seen at the '%s' logging level (or lower)", TALKATIVE)
 | |
| TALKATIVE:root:This should only be seen at the '4' logging level (or lower)
 | |
| 
 | |
| >>> log.log(5, "This should only be seen at the '%s' logging level (or lower)", VERBOSE)
 | |
| VERBOSE:root:This should only be seen at the '5' logging level (or lower)
 | |
| 
 | |
| >>> log.log(6, "This should only be seen at the '%s' logging level (or lower)", SOCIABLE)
 | |
| SOCIABLE:root:This should only be seen at the '6' logging level (or lower)
 | |
| 
 | |
| >>> log.log(7, "This should only be seen at the '%s' logging level (or lower)", EFFUSIVE)
 | |
| EFFUSIVE:root:This should only be seen at the '7' logging level (or lower)
 | |
| 
 | |
| >>> log.log(8, "This should only be seen at the '%s' logging level (or lower)", TERSE)
 | |
| TERSE:root:This should only be seen at the '8' logging level (or lower)
 | |
| 
 | |
| >>> log.log(9, "This should only be seen at the '%s' logging level (or lower)", TACITURN)
 | |
| TACITURN:root:This should only be seen at the '9' logging level (or lower)
 | |
| 
 | |
| >>> log.log(10, "This should only be seen at the '%s' logging level (or lower)", SILENT)
 | |
| SILENT:root:This should only be seen at the '10' logging level (or lower)
 | |
| 
 | |
| >>> log.setLevel(5)
 | |
| 
 | |
| >>> log.log(1, "This should only be seen at the '%s' logging level (or lower)", BORING)
 | |
| 
 | |
| >>> log.log(2, "This should only be seen at the '%s' logging level (or lower)", CHATTERBOX)
 | |
| 
 | |
| >>> log.log(3, "This should only be seen at the '%s' logging level (or lower)", GARRULOUS)
 | |
| 
 | |
| >>> log.log(4, "This should only be seen at the '%s' logging level (or lower)", TALKATIVE)
 | |
| 
 | |
| >>> log.log(5, "This should only be seen at the '%s' logging level (or lower)", VERBOSE)
 | |
| VERBOSE:root:This should only be seen at the '5' logging level (or lower)
 | |
| 
 | |
| >>> log.log(6, "This should only be seen at the '%s' logging level (or lower)", SOCIABLE)
 | |
| SOCIABLE:root:This should only be seen at the '6' logging level (or lower)
 | |
| 
 | |
| >>> log.log(7, "This should only be seen at the '%s' logging level (or lower)", EFFUSIVE)
 | |
| EFFUSIVE:root:This should only be seen at the '7' logging level (or lower)
 | |
| 
 | |
| >>> log.log(8, "This should only be seen at the '%s' logging level (or lower)", TERSE)
 | |
| TERSE:root:This should only be seen at the '8' logging level (or lower)
 | |
| 
 | |
| >>> log.log(9, "This should only be seen at the '%s' logging level (or lower)", TACITURN)
 | |
| TACITURN:root:This should only be seen at the '9' logging level (or lower)
 | |
| 
 | |
| >>> log.log(10, "This should only be seen at the '%s' logging level (or lower)", SILENT)
 | |
| SILENT:root:This should only be seen at the '10' logging level (or lower)
 | |
| 
 | |
| >>> log.setLevel(0)
 | |
| 
 | |
| >>> log.setLevel(6)
 | |
| 
 | |
| >>> log.log(1, "This should only be seen at the '%s' logging level (or lower)", BORING)
 | |
| 
 | |
| >>> log.log(2, "This should only be seen at the '%s' logging level (or lower)", CHATTERBOX)
 | |
| 
 | |
| >>> log.log(3, "This should only be seen at the '%s' logging level (or lower)", GARRULOUS)
 | |
| 
 | |
| >>> log.log(4, "This should only be seen at the '%s' logging level (or lower)", TALKATIVE)
 | |
| 
 | |
| >>> log.log(5, "This should only be seen at the '%s' logging level (or lower)", VERBOSE)
 | |
| 
 | |
| >>> log.log(6, "This should only be seen at the '%s' logging level (or lower)", SOCIABLE)
 | |
| SOCIABLE:root:This should only be seen at the '6' logging level (or lower)
 | |
| 
 | |
| >>> log.log(7, "This should only be seen at the '%s' logging level (or lower)", EFFUSIVE)
 | |
| EFFUSIVE:root:This should only be seen at the '7' logging level (or lower)
 | |
| 
 | |
| >>> log.log(8, "This should only be seen at the '%s' logging level (or lower)", TERSE)
 | |
| TERSE:root:This should only be seen at the '8' logging level (or lower)
 | |
| 
 | |
| >>> log.log(9, "This should only be seen at the '%s' logging level (or lower)", TACITURN)
 | |
| TACITURN:root:This should only be seen at the '9' logging level (or lower)
 | |
| 
 | |
| >>> log.log(10, "This should only be seen at the '%s' logging level (or lower)", SILENT)
 | |
| SILENT:root:This should only be seen at the '10' logging level (or lower)
 | |
| 
 | |
| >>> log.setLevel(7)
 | |
| 
 | |
| >>> log.log(1, "This should only be seen at the '%s' logging level (or lower)", BORING)
 | |
| 
 | |
| >>> log.log(2, "This should only be seen at the '%s' logging level (or lower)", CHATTERBOX)
 | |
| 
 | |
| >>> log.log(3, "This should only be seen at the '%s' logging level (or lower)", GARRULOUS)
 | |
| 
 | |
| >>> log.log(4, "This should only be seen at the '%s' logging level (or lower)", TALKATIVE)
 | |
| 
 | |
| >>> log.log(5, "This should only be seen at the '%s' logging level (or lower)", VERBOSE)
 | |
| 
 | |
| >>> log.log(6, "This should only be seen at the '%s' logging level (or lower)", SOCIABLE)
 | |
| 
 | |
| >>> log.log(7, "This should only be seen at the '%s' logging level (or lower)", EFFUSIVE)
 | |
| EFFUSIVE:root:This should only be seen at the '7' logging level (or lower)
 | |
| 
 | |
| >>> log.log(8, "This should only be seen at the '%s' logging level (or lower)", TERSE)
 | |
| TERSE:root:This should only be seen at the '8' logging level (or lower)
 | |
| 
 | |
| >>> log.log(9, "This should only be seen at the '%s' logging level (or lower)", TACITURN)
 | |
| TACITURN:root:This should only be seen at the '9' logging level (or lower)
 | |
| 
 | |
| >>> log.log(10, "This should only be seen at the '%s' logging level (or lower)", SILENT)
 | |
| SILENT:root:This should only be seen at the '10' logging level (or lower)
 | |
| 
 | |
| >>> log.setLevel(8)
 | |
| 
 | |
| >>> log.log(1, "This should only be seen at the '%s' logging level (or lower)", BORING)
 | |
| 
 | |
| >>> log.log(2, "This should only be seen at the '%s' logging level (or lower)", CHATTERBOX)
 | |
| 
 | |
| >>> log.log(3, "This should only be seen at the '%s' logging level (or lower)", GARRULOUS)
 | |
| 
 | |
| >>> log.log(4, "This should only be seen at the '%s' logging level (or lower)", TALKATIVE)
 | |
| 
 | |
| >>> log.log(5, "This should only be seen at the '%s' logging level (or lower)", VERBOSE)
 | |
| 
 | |
| >>> log.log(6, "This should only be seen at the '%s' logging level (or lower)", SOCIABLE)
 | |
| 
 | |
| >>> log.log(7, "This should only be seen at the '%s' logging level (or lower)", EFFUSIVE)
 | |
| 
 | |
| >>> log.log(8, "This should only be seen at the '%s' logging level (or lower)", TERSE)
 | |
| TERSE:root:This should only be seen at the '8' logging level (or lower)
 | |
| 
 | |
| >>> log.log(9, "This should only be seen at the '%s' logging level (or lower)", TACITURN)
 | |
| TACITURN:root:This should only be seen at the '9' logging level (or lower)
 | |
| 
 | |
| >>> log.log(10, "This should only be seen at the '%s' logging level (or lower)", SILENT)
 | |
| SILENT:root:This should only be seen at the '10' logging level (or lower)
 | |
| 
 | |
| >>> log.setLevel(9)
 | |
| 
 | |
| >>> log.log(1, "This should only be seen at the '%s' logging level (or lower)", BORING)
 | |
| 
 | |
| >>> log.log(2, "This should only be seen at the '%s' logging level (or lower)", CHATTERBOX)
 | |
| 
 | |
| >>> log.log(3, "This should only be seen at the '%s' logging level (or lower)", GARRULOUS)
 | |
| 
 | |
| >>> log.log(4, "This should only be seen at the '%s' logging level (or lower)", TALKATIVE)
 | |
| 
 | |
| >>> log.log(5, "This should only be seen at the '%s' logging level (or lower)", VERBOSE)
 | |
| 
 | |
| >>> log.log(6, "This should only be seen at the '%s' logging level (or lower)", SOCIABLE)
 | |
| 
 | |
| >>> log.log(7, "This should only be seen at the '%s' logging level (or lower)", EFFUSIVE)
 | |
| 
 | |
| >>> log.log(8, "This should only be seen at the '%s' logging level (or lower)", TERSE)
 | |
| 
 | |
| >>> log.log(9, "This should only be seen at the '%s' logging level (or lower)", TACITURN)
 | |
| TACITURN:root:This should only be seen at the '9' logging level (or lower)
 | |
| 
 | |
| >>> log.log(10, "This should only be seen at the '%s' logging level (or lower)", SILENT)
 | |
| SILENT:root:This should only be seen at the '10' logging level (or lower)
 | |
| 
 | |
| >>> log.setLevel(10)
 | |
| 
 | |
| >>> log.log(1, "This should only be seen at the '%s' logging level (or lower)", BORING)
 | |
| 
 | |
| >>> log.log(2, "This should only be seen at the '%s' logging level (or lower)", CHATTERBOX)
 | |
| 
 | |
| >>> log.log(3, "This should only be seen at the '%s' logging level (or lower)", GARRULOUS)
 | |
| 
 | |
| >>> log.log(4, "This should only be seen at the '%s' logging level (or lower)", TALKATIVE)
 | |
| 
 | |
| >>> log.log(5, "This should only be seen at the '%s' logging level (or lower)", VERBOSE)
 | |
| 
 | |
| >>> log.log(6, "This should only be seen at the '%s' logging level (or lower)", SOCIABLE)
 | |
| 
 | |
| >>> log.log(7, "This should only be seen at the '%s' logging level (or lower)", EFFUSIVE)
 | |
| 
 | |
| >>> log.log(8, "This should only be seen at the '%s' logging level (or lower)", TERSE)
 | |
| 
 | |
| >>> log.log(9, "This should only be seen at the '%s' logging level (or lower)", TACITURN)
 | |
| 
 | |
| >>> log.log(10, "This should only be seen at the '%s' logging level (or lower)", SILENT)
 | |
| SILENT:root:This should only be seen at the '10' logging level (or lower)
 | |
| 
 | |
| >>> spec = VerySpecificFilter()
 | |
| 
 | |
| >>> log.addFilter(spec)
 | |
| 
 | |
| >>> log.setLevel(1)
 | |
| 
 | |
| >>> log.log(1, "This should only be seen at the '%s' logging level (or lower)", BORING)
 | |
| BORING:root:This should only be seen at the '1' logging level (or lower)
 | |
| 
 | |
| >>> log.log(2, "This should only be seen at the '%s' logging level (or lower)", CHATTERBOX)
 | |
| CHATTERBOX:root:This should only be seen at the '2' logging level (or lower)
 | |
| 
 | |
| >>> log.log(3, "This should only be seen at the '%s' logging level (or lower)", GARRULOUS)
 | |
| 
 | |
| >>> log.log(4, "This should only be seen at the '%s' logging level (or lower)", TALKATIVE)
 | |
| TALKATIVE:root:This should only be seen at the '4' logging level (or lower)
 | |
| 
 | |
| >>> log.log(5, "This should only be seen at the '%s' logging level (or lower)", VERBOSE)
 | |
| VERBOSE:root:This should only be seen at the '5' logging level (or lower)
 | |
| 
 | |
| >>> log.log(6, "This should only be seen at the '%s' logging level (or lower)", SOCIABLE)
 | |
| 
 | |
| >>> log.log(7, "This should only be seen at the '%s' logging level (or lower)", EFFUSIVE)
 | |
| EFFUSIVE:root:This should only be seen at the '7' logging level (or lower)
 | |
| 
 | |
| >>> log.log(8, "This should only be seen at the '%s' logging level (or lower)", TERSE)
 | |
| TERSE:root:This should only be seen at the '8' logging level (or lower)
 | |
| 
 | |
| >>> log.log(9, "This should only be seen at the '%s' logging level (or lower)", TACITURN)
 | |
| 
 | |
| >>> log.log(10, "This should only be seen at the '%s' logging level (or lower)", SILENT)
 | |
| SILENT:root:This should only be seen at the '10' logging level (or lower)
 | |
| 
 | |
| >>> log.setLevel(2)
 | |
| 
 | |
| >>> log.log(1, "This should only be seen at the '%s' logging level (or lower)", BORING)
 | |
| 
 | |
| >>> log.log(2, "This should only be seen at the '%s' logging level (or lower)", CHATTERBOX)
 | |
| CHATTERBOX:root:This should only be seen at the '2' logging level (or lower)
 | |
| 
 | |
| >>> log.log(3, "This should only be seen at the '%s' logging level (or lower)", GARRULOUS)
 | |
| 
 | |
| >>> log.log(4, "This should only be seen at the '%s' logging level (or lower)", TALKATIVE)
 | |
| TALKATIVE:root:This should only be seen at the '4' logging level (or lower)
 | |
| 
 | |
| >>> log.log(5, "This should only be seen at the '%s' logging level (or lower)", VERBOSE)
 | |
| VERBOSE:root:This should only be seen at the '5' logging level (or lower)
 | |
| 
 | |
| >>> log.log(6, "This should only be seen at the '%s' logging level (or lower)", SOCIABLE)
 | |
| 
 | |
| >>> log.log(7, "This should only be seen at the '%s' logging level (or lower)", EFFUSIVE)
 | |
| EFFUSIVE:root:This should only be seen at the '7' logging level (or lower)
 | |
| 
 | |
| >>> log.log(8, "This should only be seen at the '%s' logging level (or lower)", TERSE)
 | |
| TERSE:root:This should only be seen at the '8' logging level (or lower)
 | |
| 
 | |
| >>> log.log(9, "This should only be seen at the '%s' logging level (or lower)", TACITURN)
 | |
| 
 | |
| >>> log.log(10, "This should only be seen at the '%s' logging level (or lower)", SILENT)
 | |
| SILENT:root:This should only be seen at the '10' logging level (or lower)
 | |
| 
 | |
| >>> log.setLevel(3)
 | |
| 
 | |
| >>> log.log(1, "This should only be seen at the '%s' logging level (or lower)", BORING)
 | |
| 
 | |
| >>> log.log(2, "This should only be seen at the '%s' logging level (or lower)", CHATTERBOX)
 | |
| 
 | |
| >>> log.log(3, "This should only be seen at the '%s' logging level (or lower)", GARRULOUS)
 | |
| 
 | |
| >>> log.log(4, "This should only be seen at the '%s' logging level (or lower)", TALKATIVE)
 | |
| TALKATIVE:root:This should only be seen at the '4' logging level (or lower)
 | |
| 
 | |
| >>> log.log(5, "This should only be seen at the '%s' logging level (or lower)", VERBOSE)
 | |
| VERBOSE:root:This should only be seen at the '5' logging level (or lower)
 | |
| 
 | |
| >>> log.log(6, "This should only be seen at the '%s' logging level (or lower)", SOCIABLE)
 | |
| 
 | |
| >>> log.log(7, "This should only be seen at the '%s' logging level (or lower)", EFFUSIVE)
 | |
| EFFUSIVE:root:This should only be seen at the '7' logging level (or lower)
 | |
| 
 | |
| >>> log.log(8, "This should only be seen at the '%s' logging level (or lower)", TERSE)
 | |
| TERSE:root:This should only be seen at the '8' logging level (or lower)
 | |
| 
 | |
| >>> log.log(9, "This should only be seen at the '%s' logging level (or lower)", TACITURN)
 | |
| 
 | |
| >>> log.log(10, "This should only be seen at the '%s' logging level (or lower)", SILENT)
 | |
| SILENT:root:This should only be seen at the '10' logging level (or lower)
 | |
| 
 | |
| >>> log.setLevel(4)
 | |
| 
 | |
| >>> log.log(1, "This should only be seen at the '%s' logging level (or lower)", BORING)
 | |
| 
 | |
| >>> log.log(2, "This should only be seen at the '%s' logging level (or lower)", CHATTERBOX)
 | |
| 
 | |
| >>> log.log(3, "This should only be seen at the '%s' logging level (or lower)", GARRULOUS)
 | |
| 
 | |
| >>> log.log(4, "This should only be seen at the '%s' logging level (or lower)", TALKATIVE)
 | |
| TALKATIVE:root:This should only be seen at the '4' logging level (or lower)
 | |
| 
 | |
| >>> log.log(5, "This should only be seen at the '%s' logging level (or lower)", VERBOSE)
 | |
| VERBOSE:root:This should only be seen at the '5' logging level (or lower)
 | |
| 
 | |
| >>> log.log(6, "This should only be seen at the '%s' logging level (or lower)", SOCIABLE)
 | |
| 
 | |
| >>> log.log(7, "This should only be seen at the '%s' logging level (or lower)", EFFUSIVE)
 | |
| EFFUSIVE:root:This should only be seen at the '7' logging level (or lower)
 | |
| 
 | |
| >>> log.log(8, "This should only be seen at the '%s' logging level (or lower)", TERSE)
 | |
| TERSE:root:This should only be seen at the '8' logging level (or lower)
 | |
| 
 | |
| >>> log.log(9, "This should only be seen at the '%s' logging level (or lower)", TACITURN)
 | |
| 
 | |
| >>> log.log(10, "This should only be seen at the '%s' logging level (or lower)", SILENT)
 | |
| SILENT:root:This should only be seen at the '10' logging level (or lower)
 | |
| 
 | |
| >>> log.setLevel(5)
 | |
| 
 | |
| >>> log.log(1, "This should only be seen at the '%s' logging level (or lower)", BORING)
 | |
| 
 | |
| >>> log.log(2, "This should only be seen at the '%s' logging level (or lower)", CHATTERBOX)
 | |
| 
 | |
| >>> log.log(3, "This should only be seen at the '%s' logging level (or lower)", GARRULOUS)
 | |
| 
 | |
| >>> log.log(4, "This should only be seen at the '%s' logging level (or lower)", TALKATIVE)
 | |
| 
 | |
| >>> log.log(5, "This should only be seen at the '%s' logging level (or lower)", VERBOSE)
 | |
| VERBOSE:root:This should only be seen at the '5' logging level (or lower)
 | |
| 
 | |
| >>> log.log(6, "This should only be seen at the '%s' logging level (or lower)", SOCIABLE)
 | |
| 
 | |
| >>> log.log(7, "This should only be seen at the '%s' logging level (or lower)", EFFUSIVE)
 | |
| EFFUSIVE:root:This should only be seen at the '7' logging level (or lower)
 | |
| 
 | |
| >>> log.log(8, "This should only be seen at the '%s' logging level (or lower)", TERSE)
 | |
| TERSE:root:This should only be seen at the '8' logging level (or lower)
 | |
| 
 | |
| >>> log.log(9, "This should only be seen at the '%s' logging level (or lower)", TACITURN)
 | |
| 
 | |
| >>> log.log(10, "This should only be seen at the '%s' logging level (or lower)", SILENT)
 | |
| SILENT:root:This should only be seen at the '10' logging level (or lower)
 | |
| 
 | |
| >>> log.setLevel(6)
 | |
| 
 | |
| >>> log.log(1, "This should only be seen at the '%s' logging level (or lower)", BORING)
 | |
| 
 | |
| >>> log.log(2, "This should only be seen at the '%s' logging level (or lower)", CHATTERBOX)
 | |
| 
 | |
| >>> log.log(3, "This should only be seen at the '%s' logging level (or lower)", GARRULOUS)
 | |
| 
 | |
| >>> log.log(4, "This should only be seen at the '%s' logging level (or lower)", TALKATIVE)
 | |
| 
 | |
| >>> log.log(5, "This should only be seen at the '%s' logging level (or lower)", VERBOSE)
 | |
| 
 | |
| >>> log.log(6, "This should only be seen at the '%s' logging level (or lower)", SOCIABLE)
 | |
| 
 | |
| >>> log.log(7, "This should only be seen at the '%s' logging level (or lower)", EFFUSIVE)
 | |
| EFFUSIVE:root:This should only be seen at the '7' logging level (or lower)
 | |
| 
 | |
| >>> log.log(8, "This should only be seen at the '%s' logging level (or lower)", TERSE)
 | |
| TERSE:root:This should only be seen at the '8' logging level (or lower)
 | |
| 
 | |
| >>> log.log(9, "This should only be seen at the '%s' logging level (or lower)", TACITURN)
 | |
| 
 | |
| >>> log.log(10, "This should only be seen at the '%s' logging level (or lower)", SILENT)
 | |
| SILENT:root:This should only be seen at the '10' logging level (or lower)
 | |
| 
 | |
| >>> log.setLevel(7)
 | |
| 
 | |
| >>> log.log(1, "This should only be seen at the '%s' logging level (or lower)", BORING)
 | |
| 
 | |
| >>> log.log(2, "This should only be seen at the '%s' logging level (or lower)", CHATTERBOX)
 | |
| 
 | |
| >>> log.log(3, "This should only be seen at the '%s' logging level (or lower)", GARRULOUS)
 | |
| 
 | |
| >>> log.log(4, "This should only be seen at the '%s' logging level (or lower)", TALKATIVE)
 | |
| 
 | |
| >>> log.log(5, "This should only be seen at the '%s' logging level (or lower)", VERBOSE)
 | |
| 
 | |
| >>> log.log(6, "This should only be seen at the '%s' logging level (or lower)", SOCIABLE)
 | |
| 
 | |
| >>> log.log(7, "This should only be seen at the '%s' logging level (or lower)", EFFUSIVE)
 | |
| EFFUSIVE:root:This should only be seen at the '7' logging level (or lower)
 | |
| 
 | |
| >>> log.log(8, "This should only be seen at the '%s' logging level (or lower)", TERSE)
 | |
| TERSE:root:This should only be seen at the '8' logging level (or lower)
 | |
| 
 | |
| >>> log.log(9, "This should only be seen at the '%s' logging level (or lower)", TACITURN)
 | |
| 
 | |
| >>> log.log(10, "This should only be seen at the '%s' logging level (or lower)", SILENT)
 | |
| SILENT:root:This should only be seen at the '10' logging level (or lower)
 | |
| 
 | |
| >>> log.setLevel(8)
 | |
| 
 | |
| >>> log.log(1, "This should only be seen at the '%s' logging level (or lower)", BORING)
 | |
| 
 | |
| >>> log.log(2, "This should only be seen at the '%s' logging level (or lower)", CHATTERBOX)
 | |
| 
 | |
| >>> log.log(3, "This should only be seen at the '%s' logging level (or lower)", GARRULOUS)
 | |
| 
 | |
| >>> log.log(4, "This should only be seen at the '%s' logging level (or lower)", TALKATIVE)
 | |
| 
 | |
| >>> log.log(5, "This should only be seen at the '%s' logging level (or lower)", VERBOSE)
 | |
| 
 | |
| >>> log.log(6, "This should only be seen at the '%s' logging level (or lower)", SOCIABLE)
 | |
| 
 | |
| >>> log.log(7, "This should only be seen at the '%s' logging level (or lower)", EFFUSIVE)
 | |
| 
 | |
| >>> log.log(8, "This should only be seen at the '%s' logging level (or lower)", TERSE)
 | |
| TERSE:root:This should only be seen at the '8' logging level (or lower)
 | |
| 
 | |
| >>> log.log(9, "This should only be seen at the '%s' logging level (or lower)", TACITURN)
 | |
| 
 | |
| >>> log.log(10, "This should only be seen at the '%s' logging level (or lower)", SILENT)
 | |
| SILENT:root:This should only be seen at the '10' logging level (or lower)
 | |
| 
 | |
| >>> log.setLevel(9)
 | |
| 
 | |
| >>> log.log(1, "This should only be seen at the '%s' logging level (or lower)", BORING)
 | |
| 
 | |
| >>> log.log(2, "This should only be seen at the '%s' logging level (or lower)", CHATTERBOX)
 | |
| 
 | |
| >>> log.log(3, "This should only be seen at the '%s' logging level (or lower)", GARRULOUS)
 | |
| 
 | |
| >>> log.log(4, "This should only be seen at the '%s' logging level (or lower)", TALKATIVE)
 | |
| 
 | |
| >>> log.log(5, "This should only be seen at the '%s' logging level (or lower)", VERBOSE)
 | |
| 
 | |
| >>> log.log(6, "This should only be seen at the '%s' logging level (or lower)", SOCIABLE)
 | |
| 
 | |
| >>> log.log(7, "This should only be seen at the '%s' logging level (or lower)", EFFUSIVE)
 | |
| 
 | |
| >>> log.log(8, "This should only be seen at the '%s' logging level (or lower)", TERSE)
 | |
| 
 | |
| >>> log.log(9, "This should only be seen at the '%s' logging level (or lower)", TACITURN)
 | |
| 
 | |
| >>> log.log(10, "This should only be seen at the '%s' logging level (or lower)", SILENT)
 | |
| SILENT:root:This should only be seen at the '10' logging level (or lower)
 | |
| 
 | |
| >>> log.setLevel(10)
 | |
| 
 | |
| >>> log.log(1, "This should only be seen at the '%s' logging level (or lower)", BORING)
 | |
| 
 | |
| >>> log.log(2, "This should only be seen at the '%s' logging level (or lower)", CHATTERBOX)
 | |
| 
 | |
| >>> log.log(3, "This should only be seen at the '%s' logging level (or lower)", GARRULOUS)
 | |
| 
 | |
| >>> log.log(4, "This should only be seen at the '%s' logging level (or lower)", TALKATIVE)
 | |
| 
 | |
| >>> log.log(5, "This should only be seen at the '%s' logging level (or lower)", VERBOSE)
 | |
| 
 | |
| >>> log.log(6, "This should only be seen at the '%s' logging level (or lower)", SOCIABLE)
 | |
| 
 | |
| >>> log.log(7, "This should only be seen at the '%s' logging level (or lower)", EFFUSIVE)
 | |
| 
 | |
| >>> log.log(8, "This should only be seen at the '%s' logging level (or lower)", TERSE)
 | |
| 
 | |
| >>> log.log(9, "This should only be seen at the '%s' logging level (or lower)", TACITURN)
 | |
| 
 | |
| >>> log.log(10, "This should only be seen at the '%s' logging level (or lower)", SILENT)
 | |
| SILENT:root:This should only be seen at the '10' logging level (or lower)
 | |
| 
 | |
| >>> log.setLevel(0)
 | |
| 
 | |
| >>> log.removeFilter(spec)
 | |
| 
 | |
| >>> hdlr.removeFilter(garr)
 | |
| 
 | |
| >>> logging.addLevelName(logging.DEBUG, "DEBUG")
 | |
| 
 | |
| 
 | |
| Test 2
 | |
| ======
 | |
| Test memory handlers. These are basically buffers for log messages: they take so many messages, and then print them all.
 | |
| 
 | |
| >>> import logging.handlers
 | |
| 
 | |
| >>> sys.stderr = sys.stdout
 | |
| >>> logger = logging.getLogger("")
 | |
| >>> sh = logger.handlers[0]
 | |
| >>> sh.close()
 | |
| >>> logger.removeHandler(sh)
 | |
| >>> mh = logging.handlers.MemoryHandler(10,logging.WARNING, sh)
 | |
| >>> logger.setLevel(logging.DEBUG)
 | |
| >>> logger.addHandler(mh)
 | |
| 
 | |
| >>> logger.debug("Debug message")
 | |
| 
 | |
| -- logging at INFO, nothing should be seen yet --
 | |
| 
 | |
| >>> logger.info("Info message")
 | |
| 
 | |
| -- logging at WARNING, 3 messages should be seen --
 | |
| 
 | |
| >>> logger.warn("Warn message")
 | |
| DEBUG:root:Debug message
 | |
| INFO:root:Info message
 | |
| WARNING:root:Warn message
 | |
| 
 | |
| >>> logger.info("Info index = 0")
 | |
| 
 | |
| >>> logger.info("Info index = 1")
 | |
| 
 | |
| >>> logger.info("Info index = 2")
 | |
| 
 | |
| >>> logger.info("Info index = 3")
 | |
| 
 | |
| >>> logger.info("Info index = 4")
 | |
| 
 | |
| >>> logger.info("Info index = 5")
 | |
| 
 | |
| >>> logger.info("Info index = 6")
 | |
| 
 | |
| >>> logger.info("Info index = 7")
 | |
| 
 | |
| >>> logger.info("Info index = 8")
 | |
| 
 | |
| >>> logger.info("Info index = 9")
 | |
| INFO:root:Info index = 0
 | |
| INFO:root:Info index = 1
 | |
| INFO:root:Info index = 2
 | |
| INFO:root:Info index = 3
 | |
| INFO:root:Info index = 4
 | |
| INFO:root:Info index = 5
 | |
| INFO:root:Info index = 6
 | |
| INFO:root:Info index = 7
 | |
| INFO:root:Info index = 8
 | |
| INFO:root:Info index = 9
 | |
| 
 | |
| >>> logger.info("Info index = 10")
 | |
| 
 | |
| >>> logger.info("Info index = 11")
 | |
| 
 | |
| >>> logger.info("Info index = 12")
 | |
| 
 | |
| >>> logger.info("Info index = 13")
 | |
| 
 | |
| >>> logger.info("Info index = 14")
 | |
| 
 | |
| >>> logger.info("Info index = 15")
 | |
| 
 | |
| >>> logger.info("Info index = 16")
 | |
| 
 | |
| >>> logger.info("Info index = 17")
 | |
| 
 | |
| >>> logger.info("Info index = 18")
 | |
| 
 | |
| >>> logger.info("Info index = 19")
 | |
| INFO:root:Info index = 10
 | |
| INFO:root:Info index = 11
 | |
| INFO:root:Info index = 12
 | |
| INFO:root:Info index = 13
 | |
| INFO:root:Info index = 14
 | |
| INFO:root:Info index = 15
 | |
| INFO:root:Info index = 16
 | |
| INFO:root:Info index = 17
 | |
| INFO:root:Info index = 18
 | |
| INFO:root:Info index = 19
 | |
| 
 | |
| >>> logger.info("Info index = 20")
 | |
| 
 | |
| >>> logger.info("Info index = 21")
 | |
| 
 | |
| >>> logger.info("Info index = 22")
 | |
| 
 | |
| >>> logger.info("Info index = 23")
 | |
| 
 | |
| >>> logger.info("Info index = 24")
 | |
| 
 | |
| >>> logger.info("Info index = 25")
 | |
| 
 | |
| >>> logger.info("Info index = 26")
 | |
| 
 | |
| >>> logger.info("Info index = 27")
 | |
| 
 | |
| >>> logger.info("Info index = 28")
 | |
| 
 | |
| >>> logger.info("Info index = 29")
 | |
| INFO:root:Info index = 20
 | |
| INFO:root:Info index = 21
 | |
| INFO:root:Info index = 22
 | |
| INFO:root:Info index = 23
 | |
| INFO:root:Info index = 24
 | |
| INFO:root:Info index = 25
 | |
| INFO:root:Info index = 26
 | |
| INFO:root:Info index = 27
 | |
| INFO:root:Info index = 28
 | |
| INFO:root:Info index = 29
 | |
| 
 | |
| >>> logger.info("Info index = 30")
 | |
| 
 | |
| >>> logger.info("Info index = 31")
 | |
| 
 | |
| >>> logger.info("Info index = 32")
 | |
| 
 | |
| >>> logger.info("Info index = 33")
 | |
| 
 | |
| >>> logger.info("Info index = 34")
 | |
| 
 | |
| >>> logger.info("Info index = 35")
 | |
| 
 | |
| >>> logger.info("Info index = 36")
 | |
| 
 | |
| >>> logger.info("Info index = 37")
 | |
| 
 | |
| >>> logger.info("Info index = 38")
 | |
| 
 | |
| >>> logger.info("Info index = 39")
 | |
| INFO:root:Info index = 30
 | |
| INFO:root:Info index = 31
 | |
| INFO:root:Info index = 32
 | |
| INFO:root:Info index = 33
 | |
| INFO:root:Info index = 34
 | |
| INFO:root:Info index = 35
 | |
| INFO:root:Info index = 36
 | |
| INFO:root:Info index = 37
 | |
| INFO:root:Info index = 38
 | |
| INFO:root:Info index = 39
 | |
| 
 | |
| >>> logger.info("Info index = 40")
 | |
| 
 | |
| >>> logger.info("Info index = 41")
 | |
| 
 | |
| >>> logger.info("Info index = 42")
 | |
| 
 | |
| >>> logger.info("Info index = 43")
 | |
| 
 | |
| >>> logger.info("Info index = 44")
 | |
| 
 | |
| >>> logger.info("Info index = 45")
 | |
| 
 | |
| >>> logger.info("Info index = 46")
 | |
| 
 | |
| >>> logger.info("Info index = 47")
 | |
| 
 | |
| >>> logger.info("Info index = 48")
 | |
| 
 | |
| >>> logger.info("Info index = 49")
 | |
| INFO:root:Info index = 40
 | |
| INFO:root:Info index = 41
 | |
| INFO:root:Info index = 42
 | |
| INFO:root:Info index = 43
 | |
| INFO:root:Info index = 44
 | |
| INFO:root:Info index = 45
 | |
| INFO:root:Info index = 46
 | |
| INFO:root:Info index = 47
 | |
| INFO:root:Info index = 48
 | |
| INFO:root:Info index = 49
 | |
| 
 | |
| >>> logger.info("Info index = 50")
 | |
| 
 | |
| >>> logger.info("Info index = 51")
 | |
| 
 | |
| >>> logger.info("Info index = 52")
 | |
| 
 | |
| >>> logger.info("Info index = 53")
 | |
| 
 | |
| >>> logger.info("Info index = 54")
 | |
| 
 | |
| >>> logger.info("Info index = 55")
 | |
| 
 | |
| >>> logger.info("Info index = 56")
 | |
| 
 | |
| >>> logger.info("Info index = 57")
 | |
| 
 | |
| >>> logger.info("Info index = 58")
 | |
| 
 | |
| >>> logger.info("Info index = 59")
 | |
| INFO:root:Info index = 50
 | |
| INFO:root:Info index = 51
 | |
| INFO:root:Info index = 52
 | |
| INFO:root:Info index = 53
 | |
| INFO:root:Info index = 54
 | |
| INFO:root:Info index = 55
 | |
| INFO:root:Info index = 56
 | |
| INFO:root:Info index = 57
 | |
| INFO:root:Info index = 58
 | |
| INFO:root:Info index = 59
 | |
| 
 | |
| >>> logger.info("Info index = 60")
 | |
| 
 | |
| >>> logger.info("Info index = 61")
 | |
| 
 | |
| >>> logger.info("Info index = 62")
 | |
| 
 | |
| >>> logger.info("Info index = 63")
 | |
| 
 | |
| >>> logger.info("Info index = 64")
 | |
| 
 | |
| >>> logger.info("Info index = 65")
 | |
| 
 | |
| >>> logger.info("Info index = 66")
 | |
| 
 | |
| >>> logger.info("Info index = 67")
 | |
| 
 | |
| >>> logger.info("Info index = 68")
 | |
| 
 | |
| >>> logger.info("Info index = 69")
 | |
| INFO:root:Info index = 60
 | |
| INFO:root:Info index = 61
 | |
| INFO:root:Info index = 62
 | |
| INFO:root:Info index = 63
 | |
| INFO:root:Info index = 64
 | |
| INFO:root:Info index = 65
 | |
| INFO:root:Info index = 66
 | |
| INFO:root:Info index = 67
 | |
| INFO:root:Info index = 68
 | |
| INFO:root:Info index = 69
 | |
| 
 | |
| >>> logger.info("Info index = 70")
 | |
| 
 | |
| >>> logger.info("Info index = 71")
 | |
| 
 | |
| >>> logger.info("Info index = 72")
 | |
| 
 | |
| >>> logger.info("Info index = 73")
 | |
| 
 | |
| >>> logger.info("Info index = 74")
 | |
| 
 | |
| >>> logger.info("Info index = 75")
 | |
| 
 | |
| >>> logger.info("Info index = 76")
 | |
| 
 | |
| >>> logger.info("Info index = 77")
 | |
| 
 | |
| >>> logger.info("Info index = 78")
 | |
| 
 | |
| >>> logger.info("Info index = 79")
 | |
| INFO:root:Info index = 70
 | |
| INFO:root:Info index = 71
 | |
| INFO:root:Info index = 72
 | |
| INFO:root:Info index = 73
 | |
| INFO:root:Info index = 74
 | |
| INFO:root:Info index = 75
 | |
| INFO:root:Info index = 76
 | |
| INFO:root:Info index = 77
 | |
| INFO:root:Info index = 78
 | |
| INFO:root:Info index = 79
 | |
| 
 | |
| >>> logger.info("Info index = 80")
 | |
| 
 | |
| >>> logger.info("Info index = 81")
 | |
| 
 | |
| >>> logger.info("Info index = 82")
 | |
| 
 | |
| >>> logger.info("Info index = 83")
 | |
| 
 | |
| >>> logger.info("Info index = 84")
 | |
| 
 | |
| >>> logger.info("Info index = 85")
 | |
| 
 | |
| >>> logger.info("Info index = 86")
 | |
| 
 | |
| >>> logger.info("Info index = 87")
 | |
| 
 | |
| >>> logger.info("Info index = 88")
 | |
| 
 | |
| >>> logger.info("Info index = 89")
 | |
| INFO:root:Info index = 80
 | |
| INFO:root:Info index = 81
 | |
| INFO:root:Info index = 82
 | |
| INFO:root:Info index = 83
 | |
| INFO:root:Info index = 84
 | |
| INFO:root:Info index = 85
 | |
| INFO:root:Info index = 86
 | |
| INFO:root:Info index = 87
 | |
| INFO:root:Info index = 88
 | |
| INFO:root:Info index = 89
 | |
| 
 | |
| >>> logger.info("Info index = 90")
 | |
| 
 | |
| >>> logger.info("Info index = 91")
 | |
| 
 | |
| >>> logger.info("Info index = 92")
 | |
| 
 | |
| >>> logger.info("Info index = 93")
 | |
| 
 | |
| >>> logger.info("Info index = 94")
 | |
| 
 | |
| >>> logger.info("Info index = 95")
 | |
| 
 | |
| >>> logger.info("Info index = 96")
 | |
| 
 | |
| >>> logger.info("Info index = 97")
 | |
| 
 | |
| >>> logger.info("Info index = 98")
 | |
| 
 | |
| >>> logger.info("Info index = 99")
 | |
| INFO:root:Info index = 90
 | |
| INFO:root:Info index = 91
 | |
| INFO:root:Info index = 92
 | |
| INFO:root:Info index = 93
 | |
| INFO:root:Info index = 94
 | |
| INFO:root:Info index = 95
 | |
| INFO:root:Info index = 96
 | |
| INFO:root:Info index = 97
 | |
| INFO:root:Info index = 98
 | |
| INFO:root:Info index = 99
 | |
| 
 | |
| >>> logger.info("Info index = 100")
 | |
| 
 | |
| >>> logger.info("Info index = 101")
 | |
| 
 | |
| >>> mh.close()
 | |
| INFO:root:Info index = 100
 | |
| INFO:root:Info index = 101
 | |
| 
 | |
| >>> logger.removeHandler(mh)
 | |
| >>> logger.addHandler(sh)
 | |
| 
 | |
| 
 | |
| 
 | |
| Test 3
 | |
| ======
 | |
| 
 | |
| >>> import sys, logging
 | |
| >>> sys.stderr = sys
 | |
| >>> logging.basicConfig()
 | |
| >>> FILTER = "a.b"
 | |
| >>> root = logging.getLogger()
 | |
| >>> root.setLevel(logging.DEBUG)
 | |
| >>> hand = root.handlers[0]
 | |
| 
 | |
| >>> logging.getLogger("a").info("Info 1")
 | |
| INFO:a:Info 1
 | |
| 
 | |
| >>> logging.getLogger("a.b").info("Info 2")
 | |
| INFO:a.b:Info 2
 | |
| 
 | |
| >>> logging.getLogger("a.c").info("Info 3")
 | |
| INFO:a.c:Info 3
 | |
| 
 | |
| >>> logging.getLogger("a.b.c").info("Info 4")
 | |
| INFO:a.b.c:Info 4
 | |
| 
 | |
| >>> logging.getLogger("a.b.c.d").info("Info 5")
 | |
| INFO:a.b.c.d:Info 5
 | |
| 
 | |
| >>> logging.getLogger("a.bb.c").info("Info 6")
 | |
| INFO:a.bb.c:Info 6
 | |
| 
 | |
| >>> logging.getLogger("b").info("Info 7")
 | |
| INFO:b:Info 7
 | |
| 
 | |
| >>> logging.getLogger("b.a").info("Info 8")
 | |
| INFO:b.a:Info 8
 | |
| 
 | |
| >>> logging.getLogger("c.a.b").info("Info 9")
 | |
| INFO:c.a.b:Info 9
 | |
| 
 | |
| >>> logging.getLogger("a.bb").info("Info 10")
 | |
| INFO:a.bb:Info 10
 | |
| 
 | |
| Filtered with 'a.b'...
 | |
| 
 | |
| >>> filt = logging.Filter(FILTER)
 | |
| 
 | |
| >>> hand.addFilter(filt)
 | |
| 
 | |
| >>> logging.getLogger("a").info("Info 1")
 | |
| 
 | |
| >>> logging.getLogger("a.b").info("Info 2")
 | |
| INFO:a.b:Info 2
 | |
| 
 | |
| >>> logging.getLogger("a.c").info("Info 3")
 | |
| 
 | |
| >>> logging.getLogger("a.b.c").info("Info 4")
 | |
| INFO:a.b.c:Info 4
 | |
| 
 | |
| >>> logging.getLogger("a.b.c.d").info("Info 5")
 | |
| INFO:a.b.c.d:Info 5
 | |
| 
 | |
| >>> logging.getLogger("a.bb.c").info("Info 6")
 | |
| 
 | |
| >>> logging.getLogger("b").info("Info 7")
 | |
| 
 | |
| >>> logging.getLogger("b.a").info("Info 8")
 | |
| 
 | |
| >>> logging.getLogger("c.a.b").info("Info 9")
 | |
| 
 | |
| >>> logging.getLogger("a.bb").info("Info 10")
 | |
| 
 | |
| >>> hand.removeFilter(filt)
 | |
| 
 | |
| 
 | |
| Test 4
 | |
| ======
 | |
| >>> import sys, logging, logging.handlers, string
 | |
| >>> import tempfile, logging.config, os, test.test_support
 | |
| >>> sys.stderr = sys.stdout
 | |
| 
 | |
| >>> from test_logging import config0, config1
 | |
| 
 | |
| config2 has a subtle configuration error that should be reported
 | |
| >>> config2 = string.replace(config1, "sys.stdout", "sys.stbout")
 | |
| 
 | |
| config3 has a less subtle configuration error
 | |
| >>> config3 = string.replace(config1, "formatter=form1", "formatter=misspelled_name")
 | |
| 
 | |
| >>> def test4(conf):
 | |
| ...     loggerDict = logging.getLogger().manager.loggerDict
 | |
| ...     logging._acquireLock()
 | |
| ...     try:
 | |
| ...         saved_handlers = logging._handlers.copy()
 | |
| ...         saved_handler_list = logging._handlerList[:]
 | |
| ...         saved_loggers = loggerDict.copy()
 | |
| ...     finally:
 | |
| ...         logging._releaseLock()
 | |
| ...     try:
 | |
| ...         fn = test.test_support.TESTFN
 | |
| ...         f = open(fn, "w")
 | |
| ...         f.write(conf)
 | |
| ...         f.close()
 | |
| ...         try:
 | |
| ...             logging.config.fileConfig(fn)
 | |
| ...             #call again to make sure cleanup is correct
 | |
| ...             logging.config.fileConfig(fn)
 | |
| ...         except:
 | |
| ...             t = sys.exc_info()[0]
 | |
| ...             message(str(t))
 | |
| ...         else:
 | |
| ...             message('ok.')
 | |
| ...             os.remove(fn)
 | |
| ...     finally:
 | |
| ...         logging._acquireLock()
 | |
| ...         try:
 | |
| ...             logging._handlers.clear()
 | |
| ...             logging._handlers.update(saved_handlers)
 | |
| ...             logging._handlerList[:] = saved_handler_list
 | |
| ...             loggerDict = logging.getLogger().manager.loggerDict
 | |
| ...             loggerDict.clear()
 | |
| ...             loggerDict.update(saved_loggers)
 | |
| ...         finally:
 | |
| ...             logging._releaseLock()
 | |
| 
 | |
| >>> test4(config0)
 | |
| ok.
 | |
| 
 | |
| >>> test4(config1)
 | |
| ok.
 | |
| 
 | |
| >>> test4(config2)
 | |
| <type 'exceptions.AttributeError'>
 | |
| 
 | |
| >>> test4(config3)
 | |
| <type 'exceptions.KeyError'>
 | |
| 
 | |
| >>> import test_logging
 | |
| >>> test_logging.test5()
 | |
| ERROR:root:just testing
 | |
| <type 'exceptions.KeyError'>... Don't panic!
 | |
| 
 | |
| 
 | |
| Test Main
 | |
| =========
 | |
| >>> import select
 | |
| >>> import os, sys, string, struct, types, cPickle, cStringIO
 | |
| >>> import socket, tempfile, threading, time
 | |
| >>> import logging, logging.handlers, logging.config
 | |
| >>> import test_logging
 | |
| 
 | |
| >>> test_logging.test_main_inner()
 | |
| ERR -> CRITICAL: Message 0 (via logrecv.tcp.ERR)
 | |
| ERR -> ERROR: Message 1 (via logrecv.tcp.ERR)
 | |
| INF -> CRITICAL: Message 2 (via logrecv.tcp.INF)
 | |
| INF -> ERROR: Message 3 (via logrecv.tcp.INF)
 | |
| INF -> WARNING: Message 4 (via logrecv.tcp.INF)
 | |
| INF -> INFO: Message 5 (via logrecv.tcp.INF)
 | |
| INF.UNDEF -> CRITICAL: Message 6 (via logrecv.tcp.INF.UNDEF)
 | |
| INF.UNDEF -> ERROR: Message 7 (via logrecv.tcp.INF.UNDEF)
 | |
| INF.UNDEF -> WARNING: Message 8 (via logrecv.tcp.INF.UNDEF)
 | |
| INF.UNDEF -> INFO: Message 9 (via logrecv.tcp.INF.UNDEF)
 | |
| INF.ERR -> CRITICAL: Message 10 (via logrecv.tcp.INF.ERR)
 | |
| INF.ERR -> ERROR: Message 11 (via logrecv.tcp.INF.ERR)
 | |
| INF.ERR.UNDEF -> CRITICAL: Message 12 (via logrecv.tcp.INF.ERR.UNDEF)
 | |
| INF.ERR.UNDEF -> ERROR: Message 13 (via logrecv.tcp.INF.ERR.UNDEF)
 | |
| DEB -> CRITICAL: Message 14 (via logrecv.tcp.DEB)
 | |
| DEB -> ERROR: Message 15 (via logrecv.tcp.DEB)
 | |
| DEB -> WARNING: Message 16 (via logrecv.tcp.DEB)
 | |
| DEB -> INFO: Message 17 (via logrecv.tcp.DEB)
 | |
| DEB -> DEBUG: Message 18 (via logrecv.tcp.DEB)
 | |
| UNDEF -> CRITICAL: Message 19 (via logrecv.tcp.UNDEF)
 | |
| UNDEF -> ERROR: Message 20 (via logrecv.tcp.UNDEF)
 | |
| UNDEF -> WARNING: Message 21 (via logrecv.tcp.UNDEF)
 | |
| UNDEF -> INFO: Message 22 (via logrecv.tcp.UNDEF)
 | |
| INF.BADPARENT.UNDEF -> CRITICAL: Message 23 (via logrecv.tcp.INF.BADPARENT.UNDEF)
 | |
| INF.BADPARENT -> CRITICAL: Message 24 (via logrecv.tcp.INF.BADPARENT)
 | |
| INF -> INFO: Finish up, it's closing time. Messages should bear numbers 0 through 24. (via logrecv.tcp.INF)
 | |
| <BLANKLINE>
 | |
| """
 | |
| import select
 | |
| import os, sys, string, struct, types, cPickle, cStringIO
 | |
| import socket, tempfile, threading, time
 | |
| import logging, logging.handlers, logging.config, test.test_support
 | |
| 
 | |
| 
 | |
| BANNER = "-- %-10s %-6s ---------------------------------------------------\n"
 | |
| 
 | |
| FINISH_UP = "Finish up, it's closing time. Messages should bear numbers 0 through 24."
 | |
| #----------------------------------------------------------------------------
 | |
| # Test 0
 | |
| #----------------------------------------------------------------------------
 | |
| 
 | |
| msgcount = 0
 | |
| 
 | |
| def nextmessage():
 | |
|     global msgcount
 | |
|     rv = "Message %d" % msgcount
 | |
|     msgcount = msgcount + 1
 | |
|     return rv
 | |
| 
 | |
| #----------------------------------------------------------------------------
 | |
| # Log receiver
 | |
| #----------------------------------------------------------------------------
 | |
| 
 | |
| TIMEOUT         = 10
 | |
| 
 | |
| from SocketServer import ThreadingTCPServer, StreamRequestHandler
 | |
| 
 | |
| class LogRecordStreamHandler(StreamRequestHandler):
 | |
|     """
 | |
|     Handler for a streaming logging request. It basically logs the record
 | |
|     using whatever logging policy is configured locally.
 | |
|     """
 | |
| 
 | |
|     def handle(self):
 | |
|         """
 | |
|         Handle multiple requests - each expected to be a 4-byte length,
 | |
|         followed by the LogRecord in pickle format. Logs the record
 | |
|         according to whatever policy is configured locally.
 | |
|         """
 | |
|         while 1:
 | |
|             try:
 | |
|                 chunk = self.connection.recv(4)
 | |
|                 if len(chunk) < 4:
 | |
|                     break
 | |
|                 slen = struct.unpack(">L", chunk)[0]
 | |
|                 chunk = self.connection.recv(slen)
 | |
|                 while len(chunk) < slen:
 | |
|                     chunk = chunk + self.connection.recv(slen - len(chunk))
 | |
|                 obj = self.unPickle(chunk)
 | |
|                 record = logging.makeLogRecord(obj)
 | |
|                 self.handleLogRecord(record)
 | |
|             except:
 | |
|                 raise
 | |
| 
 | |
|     def unPickle(self, data):
 | |
|         return cPickle.loads(data)
 | |
| 
 | |
|     def handleLogRecord(self, record):
 | |
|         logname = "logrecv.tcp." + record.name
 | |
|         #If the end-of-messages sentinel is seen, tell the server to terminate
 | |
|         if record.msg == FINISH_UP:
 | |
|             self.server.abort = 1
 | |
|         record.msg = record.msg + " (via " + logname + ")"
 | |
|         logger = logging.getLogger("logrecv")
 | |
|         logger.handle(record)
 | |
| 
 | |
| # The server sets socketDataProcessed when it's done.
 | |
| socketDataProcessed = threading.Event()
 | |
| #----------------------------------------------------------------------------
 | |
| # Test 5
 | |
| #----------------------------------------------------------------------------
 | |
| 
 | |
| test5_config = """
 | |
| [loggers]
 | |
| keys=root
 | |
| 
 | |
| [handlers]
 | |
| keys=hand1
 | |
| 
 | |
| [formatters]
 | |
| keys=form1
 | |
| 
 | |
| [logger_root]
 | |
| level=NOTSET
 | |
| handlers=hand1
 | |
| 
 | |
| [handler_hand1]
 | |
| class=StreamHandler
 | |
| level=NOTSET
 | |
| formatter=form1
 | |
| args=(sys.stdout,)
 | |
| 
 | |
| [formatter_form1]
 | |
| class=test.test_logging.FriendlyFormatter
 | |
| format=%(levelname)s:%(name)s:%(message)s
 | |
| datefmt=
 | |
| """
 | |
| 
 | |
| class FriendlyFormatter (logging.Formatter):
 | |
|     def formatException(self, ei):
 | |
|         return "%s... Don't panic!" % str(ei[0])
 | |
| 
 | |
| 
 | |
| def test5():
 | |
|     loggerDict = logging.getLogger().manager.loggerDict
 | |
|     logging._acquireLock()
 | |
|     try:
 | |
|         saved_handlers = logging._handlers.copy()
 | |
|         saved_handler_list = logging._handlerList[:]
 | |
|         saved_loggers = loggerDict.copy()
 | |
|     finally:
 | |
|         logging._releaseLock()
 | |
|     try:
 | |
|         fn = test.test_support.TESTFN
 | |
|         f = open(fn, "w")
 | |
|         f.write(test5_config)
 | |
|         f.close()
 | |
|         logging.config.fileConfig(fn)
 | |
|         try:
 | |
|             raise KeyError
 | |
|         except KeyError:
 | |
|             logging.exception("just testing")
 | |
|         os.remove(fn)
 | |
|         hdlr = logging.getLogger().handlers[0]
 | |
|         logging.getLogger().handlers.remove(hdlr)
 | |
|     finally:
 | |
|         logging._acquireLock()
 | |
|         try:
 | |
|             logging._handlers.clear()
 | |
|             logging._handlers.update(saved_handlers)
 | |
|             logging._handlerList[:] = saved_handler_list
 | |
|             loggerDict = logging.getLogger().manager.loggerDict
 | |
|             loggerDict.clear()
 | |
|             loggerDict.update(saved_loggers)
 | |
|         finally:
 | |
|             logging._releaseLock()
 | |
| 
 | |
| 
 | |
| class LogRecordSocketReceiver(ThreadingTCPServer):
 | |
|     """
 | |
|     A simple-minded TCP socket-based logging receiver suitable for test
 | |
|     purposes.
 | |
|     """
 | |
| 
 | |
|     allow_reuse_address = 1
 | |
| 
 | |
|     def __init__(self, host='localhost',
 | |
|                              port=logging.handlers.DEFAULT_TCP_LOGGING_PORT,
 | |
|                      handler=LogRecordStreamHandler):
 | |
|         ThreadingTCPServer.__init__(self, (host, port), handler)
 | |
|         self.abort = False
 | |
|         self.timeout = 1
 | |
| 
 | |
|     def serve_until_stopped(self):
 | |
|         while not self.abort:
 | |
|             rd, wr, ex = select.select([self.socket.fileno()], [], [],
 | |
|                                        self.timeout)
 | |
|             if rd:
 | |
|                 self.handle_request()
 | |
|             socketDataProcessed.set()
 | |
|         # close the listen socket
 | |
|         self.server_close()
 | |
| 
 | |
|     def process_request(self, request, client_address):
 | |
|         t = threading.Thread(target = self.finish_request,
 | |
|                              args = (request, client_address))
 | |
|         t.start()
 | |
| 
 | |
| def runTCP(tcpserver):
 | |
|     tcpserver.serve_until_stopped()
 | |
| 
 | |
| def banner(nm, typ):
 | |
|     sep = BANNER % (nm, typ)
 | |
|     sys.stdout.write(sep)
 | |
|     sys.stdout.flush()
 | |
| 
 | |
| def test0():
 | |
|     ERR = logging.getLogger("ERR")
 | |
|     ERR.setLevel(logging.ERROR)
 | |
|     INF = logging.getLogger("INF")
 | |
|     INF.setLevel(logging.INFO)
 | |
|     INF_ERR  = logging.getLogger("INF.ERR")
 | |
|     INF_ERR.setLevel(logging.ERROR)
 | |
|     DEB = logging.getLogger("DEB")
 | |
|     DEB.setLevel(logging.DEBUG)
 | |
| 
 | |
|     INF_UNDEF = logging.getLogger("INF.UNDEF")
 | |
|     INF_ERR_UNDEF = logging.getLogger("INF.ERR.UNDEF")
 | |
|     UNDEF = logging.getLogger("UNDEF")
 | |
| 
 | |
|     GRANDCHILD = logging.getLogger("INF.BADPARENT.UNDEF")
 | |
|     CHILD = logging.getLogger("INF.BADPARENT")
 | |
| 
 | |
|     #These should log
 | |
|     ERR.log(logging.FATAL, nextmessage())
 | |
|     ERR.error(nextmessage())
 | |
| 
 | |
|     INF.log(logging.FATAL, nextmessage())
 | |
|     INF.error(nextmessage())
 | |
|     INF.warn(nextmessage())
 | |
|     INF.info(nextmessage())
 | |
| 
 | |
|     INF_UNDEF.log(logging.FATAL, nextmessage())
 | |
|     INF_UNDEF.error(nextmessage())
 | |
|     INF_UNDEF.warn (nextmessage())
 | |
|     INF_UNDEF.info (nextmessage())
 | |
| 
 | |
|     INF_ERR.log(logging.FATAL, nextmessage())
 | |
|     INF_ERR.error(nextmessage())
 | |
| 
 | |
|     INF_ERR_UNDEF.log(logging.FATAL, nextmessage())
 | |
|     INF_ERR_UNDEF.error(nextmessage())
 | |
| 
 | |
|     DEB.log(logging.FATAL, nextmessage())
 | |
|     DEB.error(nextmessage())
 | |
|     DEB.warn (nextmessage())
 | |
|     DEB.info (nextmessage())
 | |
|     DEB.debug(nextmessage())
 | |
| 
 | |
|     UNDEF.log(logging.FATAL, nextmessage())
 | |
|     UNDEF.error(nextmessage())
 | |
|     UNDEF.warn (nextmessage())
 | |
|     UNDEF.info (nextmessage())
 | |
| 
 | |
|     GRANDCHILD.log(logging.FATAL, nextmessage())
 | |
|     CHILD.log(logging.FATAL, nextmessage())
 | |
| 
 | |
|     #These should not log
 | |
|     ERR.warn(nextmessage())
 | |
|     ERR.info(nextmessage())
 | |
|     ERR.debug(nextmessage())
 | |
| 
 | |
|     INF.debug(nextmessage())
 | |
|     INF_UNDEF.debug(nextmessage())
 | |
| 
 | |
|     INF_ERR.warn(nextmessage())
 | |
|     INF_ERR.info(nextmessage())
 | |
|     INF_ERR.debug(nextmessage())
 | |
|     INF_ERR_UNDEF.warn(nextmessage())
 | |
|     INF_ERR_UNDEF.info(nextmessage())
 | |
|     INF_ERR_UNDEF.debug(nextmessage())
 | |
| 
 | |
|     INF.info(FINISH_UP)
 | |
| 
 | |
| def test_main_inner():
 | |
|     rootLogger = logging.getLogger("")
 | |
|     rootLogger.setLevel(logging.DEBUG)
 | |
| 
 | |
|     tcpserver = LogRecordSocketReceiver(port=0)
 | |
|     port = tcpserver.socket.getsockname()[1]
 | |
| 
 | |
|     # Set up a handler such that all events are sent via a socket to the log
 | |
|     # receiver (logrecv).
 | |
|     # The handler will only be added to the rootLogger for some of the tests
 | |
|     shdlr = logging.handlers.SocketHandler('localhost', port)
 | |
|     rootLogger.addHandler(shdlr)
 | |
| 
 | |
|     # Configure the logger for logrecv so events do not propagate beyond it.
 | |
|     # The sockLogger output is buffered in memory until the end of the test,
 | |
|     # and printed at the end.
 | |
|     sockOut = cStringIO.StringIO()
 | |
|     sockLogger = logging.getLogger("logrecv")
 | |
|     sockLogger.setLevel(logging.DEBUG)
 | |
|     sockhdlr = logging.StreamHandler(sockOut)
 | |
|     sockhdlr.setFormatter(logging.Formatter(
 | |
|                                    "%(name)s -> %(levelname)s: %(message)s"))
 | |
|     sockLogger.addHandler(sockhdlr)
 | |
|     sockLogger.propagate = 0
 | |
| 
 | |
|     #Set up servers
 | |
|     threads = []
 | |
|     #sys.stdout.write("About to start TCP server...\n")
 | |
|     threads.append(threading.Thread(target=runTCP, args=(tcpserver,)))
 | |
| 
 | |
|     for thread in threads:
 | |
|         thread.start()
 | |
|     try:
 | |
|         test0()
 | |
| 
 | |
|         # XXX(nnorwitz): Try to fix timing related test failures.
 | |
|         # This sleep gives us some extra time to read messages.
 | |
|         # The test generally only fails on Solaris without this sleep.
 | |
|         #time.sleep(2.0)
 | |
|         shdlr.close()
 | |
|         rootLogger.removeHandler(shdlr)
 | |
| 
 | |
|     finally:
 | |
|         #wait for TCP receiver to terminate
 | |
|         socketDataProcessed.wait()
 | |
|         # ensure the server dies
 | |
|         tcpserver.abort = True
 | |
|         for thread in threads:
 | |
|             thread.join(2.0)
 | |
|         print(sockOut.getvalue())
 | |
|         sockOut.close()
 | |
|         sockLogger.removeHandler(sockhdlr)
 | |
|         sockhdlr.close()
 | |
|         sys.stdout.flush()
 | |
| 
 | |
| # config0 is a standard configuration.
 | |
| config0 = """
 | |
| [loggers]
 | |
| keys=root
 | |
| 
 | |
| [handlers]
 | |
| keys=hand1
 | |
| 
 | |
| [formatters]
 | |
| keys=form1
 | |
| 
 | |
| [logger_root]
 | |
| level=NOTSET
 | |
| handlers=hand1
 | |
| 
 | |
| [handler_hand1]
 | |
| class=StreamHandler
 | |
| level=NOTSET
 | |
| formatter=form1
 | |
| args=(sys.stdout,)
 | |
| 
 | |
| [formatter_form1]
 | |
| format=%(levelname)s:%(name)s:%(message)s
 | |
| datefmt=
 | |
| """
 | |
| 
 | |
| # config1 adds a little to the standard configuration.
 | |
| config1 = """
 | |
| [loggers]
 | |
| keys=root,parser
 | |
| 
 | |
| [handlers]
 | |
| keys=hand1
 | |
| 
 | |
| [formatters]
 | |
| keys=form1
 | |
| 
 | |
| [logger_root]
 | |
| level=NOTSET
 | |
| handlers=hand1
 | |
| 
 | |
| [logger_parser]
 | |
| level=DEBUG
 | |
| handlers=hand1
 | |
| propagate=1
 | |
| qualname=compiler.parser
 | |
| 
 | |
| [handler_hand1]
 | |
| class=StreamHandler
 | |
| level=NOTSET
 | |
| formatter=form1
 | |
| args=(sys.stdout,)
 | |
| 
 | |
| [formatter_form1]
 | |
| format=%(levelname)s:%(name)s:%(message)s
 | |
| datefmt=
 | |
| """
 | |
| 
 | |
| def message(s):
 | |
|     sys.stdout.write("%s\n" % s)
 | |
| 
 | |
| # config2 has a subtle configuration error that should be reported
 | |
| config2 = string.replace(config1, "sys.stdout", "sys.stbout")
 | |
| 
 | |
| # config3 has a less subtle configuration error
 | |
| config3 = string.replace(
 | |
|     config1, "formatter=form1", "formatter=misspelled_name")
 | |
| 
 | |
| def test_main():
 | |
|     from test import test_support, test_logging
 | |
|     test_support.run_doctest(test_logging)
 | |
| 
 | |
| if __name__=="__main__":
 | |
|     test_main()
 | 
