"""
.. module:: smodelsLogging
:synopsis: Simple code that creates and configures a central logger
.. moduleauthor:: Wolfgang Waltenberger <wolfgang.waltenberger@gmail.com>
"""
import os
from smodels.tools.colors import colors
import logging
[docs]class ColorizedStreamHandler(logging.StreamHandler):
def _color_wrap(self, *c):
def wrapped(inp):
return "".join(list(c) + [inp, colors.reset])
return wrapped
def __init__(self, stream=None):
logging.StreamHandler.__init__(self, stream)
[docs] def should_color(self):
# If the stream is a tty we should color it
if hasattr( self.stream, "isatty") and self.stream.isatty():
return True
# If we have an ASNI term we should color it
if os.environ.get("TERM") == "ANSI":
return True
# If anything else we should not color it
return False
[docs]def getLogger ():
FORMAT = '%(levelname)s in %(module)s.%(funcName)s() in' \
' %(lineno)s: %(message)s'
logging.basicConfig(format=FORMAT)
formatter = logging.Formatter( FORMAT )
ch = ColorizedStreamHandler()
ch.setFormatter ( formatter )
logger = logging.getLogger("smodels")
logger.addHandler(ch)
logger.propagate = False
return logger
logger = getLogger()
[docs]def getLogLevel( asString=False ):
""" obtain the current log level.
:params asString: return string, not number.
"""
# return logger.level
ret = logger.getEffectiveLevel()
if not asString:
return ret
lvlNames= { logging.DEBUG: "debug", logging.INFO: "info",
logging.WARNING: "warning", logging.ERROR: "error",
logging.CRITICAL: "critical", logging.FATAL: "FATAL" }
lvl = list ( lvlNames.keys() )
lvl.sort( reverse = True)
for l in lvl:
if ret >= l:
return lvlNames[l]
return "unknown log level"
[docs]def setLogLevel ( level ):
""" set the log level of the central logger.
can either be directly an integer ( e.g. logging.DEBUG ),
or "debug", "info", "warning", or "error".
"""
if level == None: return
if type ( level ) == int:
logger.setLevel ( level=level )
return
level = level.lower()
levels = { "debug": logging.DEBUG, "info": logging.INFO,
"warn": logging.WARNING,
"warning": logging.WARNING, "error": logging.ERROR }
if not level in levels:
logger.error ( "Unknown log level ``%s'' supplied!" % level )
return
logger.setLevel ( level = levels[level] )