Hola, pythonisas: The documentation for the logging module is good, but a bit obscure. In particular, there seems to be a lot of action at a distance. The fact that getLogger() can actually be a call to Logger.__init__(), which is mentioned in para 6.29.1, also bears stressing on 6.29. I grasp _why_ you'd implement it that way, but I may not be the only coder who feels queasy with the word 'get' being used both to fetch an instance and to trigger instantiation. Anyway, after poring over the documentation, unit test, and source code, I'd like to show a sample script that will eventually be used in my vanity project, with four loggers of increasing granularity. I realize there are probably more ways to do this (logging seemingly sporting perl-esque flexibility ;) so please weigh in with thoughts. Perhaps now I can go back and get this to work with the logging.config interface. :) Best, Chris
#----begin log_test.py------------------ import logging #Set up a hierarchy such that we have: #root - everything, including function arguments #`trunk - function calls # `branch - application state # `leaf - externally visible actions forest = ["root","trunk","branch","leaf"] #relate our logger names to levels lumber_jack = {forest[0] : logging.DEBUG ,forest[1] : logging.INFO ,forest[2] : logging.WARNING ,forest[3] : logging.ERROR } #Used to build up the log names into a hierarchy log_name = [] for log in forest: mounty = logging.FileHandler("%s%s.txt" % ("/home/smitty/mddl/",log)) log_name.append(log) print "Instantiating %s" % ".".join(log_name) timber = logging.getLogger(".".join(log_name)) timber.setLevel(lumber_jack[log]) timber.addHandler(mounty) if lumber_jack[log] == logging.DEBUG: timber.debug( "%s's a lumberjack, and he's OK." % log) elif lumber_jack[log] == logging.INFO: timber.info( "%s's a lumberjack, and he's OK." % log) elif lumber_jack[log] == logging.WARNING: timber.warning("%s's a lumberjack, and he's OK." % log) elif lumber_jack[log] == logging.ERROR: timber.error( "%s's a lumberjack, and he's OK." % log) #Force a logging event from the handler for the current logger. # This hanlder event short-circuits the up-stream propogation # of the log record, as seen in the file outputs. mounty.emit( logging.LogRecord( timber , 0 , "/mnt/dmz/proj/mddl4/mddl.py" , 37 , "burp?" , None , None )) #----end log_test.py------------------ #-------- #output: #-------- Instantiating root Instantiating root.trunk Instantiating root.trunk.branch Instantiating root.trunk.branch.leaf #------- #The four files: #------- $cat root.txt root's a lumberjack, and he's OK. burp? trunk's a lumberjack, and he's OK. branch's a lumberjack, and he's OK. leaf's a lumberjack, and he's OK. $cat trunk.txt trunk's a lumberjack, and he's OK. burp? branch's a lumberjack, and he's OK. leaf's a lumberjack, and he's OK. $cat branch.txt branch's a lumberjack, and he's OK. burp? leaf's a lumberjack, and he's OK. $cat leaf.txt leaf's a lumberjack, and he's OK. burp? -- http://mail.python.org/mailman/listinfo/python-list