added SQLTable pickle test
[pygr.git] / pygr / logger.py
blobdaed0a11da632272e3603faeeeb01f181e098bef
1 """
2 Implements logging functionality
4 Upon import creates a module level log class (log) and
5 the following logging functions:
7 debug, info, warn and error
9 The default formatters will print out the function the log was triggered from.
10 """
12 import sys, logging
14 # python 2.5 the watershed release that introduced most changes since 2.1
16 PYTHON_25 = sys.version_info >= (2, 5)
18 def get_logger(name='pygr-log', stream=sys.stdout, formatter=None):
19 """
20 Returns a logger
22 >>> disable('INFO')
23 >>> info('logtest, this message SHOULD NOT be visible')
24 >>> disable()
25 >>> info('logtest, this message should be visible')
26 >>> disable('DEBUG')
27 >>> debug('logtest, this message SHOULD NOT be visible')
28 >>> info('logtest, this message should be visible')
29 """
30 logger = logging.getLogger(name)
32 # this is needed in case the process is
33 # forked/multithreaded; loggers exist in a global scope
34 # we don't want each import to duplocate this handler
36 if not logger.handlers:
37 console = logging.StreamHandler(stream)
38 console.setLevel(logging.DEBUG)
39 if PYTHON_25:
40 format = '%(levelname)s %(module)s.%(funcName)s: %(message)s'
41 else:
42 format = '%(levelname)s %(module)s: %(message)s'
44 formatter = formatter or logging.Formatter(format)
45 console.setFormatter(formatter)
46 logger.addHandler(console)
47 logger.setLevel(logging.DEBUG)
48 return logger
50 def disable(level=0):
51 """
52 Disables logging levels
53 Levels: DEBUG, INFO, WARNING, ERROR
55 >>> disable('INFO')
56 >>> info('logtest, this message SHOULD NOT be visible')
57 """
58 level = str(level)
59 value = dict(NOTSET=0, DEBUG=10, INFO=20, WARNING=30, ERROR=40)\
60 .get(level.upper(), 0)
61 logging.disable(value)
63 # populate some loggers by default
64 log = get_logger()
65 debug, info, warn, error = log.debug, log.info, log.warn, log.error
67 def test(verbose=0):
68 "Performs module level testing"
69 import doctest
70 doctest.testmod(verbose=verbose)
72 if __name__ == "__main__":
73 test()