a simple log mechanism styled after pep 282 the class here is styled after pep 282 so that it could later be replaced with a standard python logging implementation debug 1 info 2 warn 3 error 4 fatal 5 import sys class log def initself thresholdwarn self threshold threshold def logself level msg args if level not in debug info warn error fatal raise valueerror s wrong log level strlevel if level self threshold if args msg msg args if level in warn error fatal stream sys stderr else stream sys stdout try stream write sn msg except unicodeencodeerror emulate backslashreplace error handler encoding stream encoding msg msg encodeencoding backslashreplace decodeencoding stream write sn msg stream flush def logself level msg args self loglevel msg args def debugself msg args self logdebug msg args def infoself msg args self loginfo msg args def warnself msg args self logwarn msg args def errorself msg args self logerror msg args def fatalself msg args self logfatal msg args globallog log log globallog log debug globallog debug info globallog info warn globallog warn error globallog error fatal globallog fatal the class here is styled after pep 282 so that it could later be replaced with a standard python logging implementation emulate backslashreplace error handler
DEBUG = 1
INFO = 2
WARN = 3
ERROR = 4
FATAL = 5

import sys

class Log:

    def __init__(self, threshold=WARN):
        self.threshold = threshold

    def _log(self, level, msg, args):
        if level not in (DEBUG, INFO, WARN, ERROR, FATAL):
            raise ValueError('%s wrong log level' % str(level))

        if level >= self.threshold:
            if args:
                msg = msg % args
            if level in (WARN, ERROR, FATAL):
                stream = sys.stderr
            else:
                stream = sys.stdout
            try:
                stream.write('%s\n' % msg)
            except UnicodeEncodeError:
                
                encoding = stream.encoding
                msg = msg.encode(encoding, "backslashreplace").decode(encoding)
                stream.write('%s\n' % msg)
            stream.flush()

    def log(self, level, msg, *args):
        self._log(level, msg, args)

    def debug(self, msg, *args):
        self._log(DEBUG, msg, args)

    def info(self, msg, *args):
        self._log(INFO, msg, args)

    def warn(self, msg, *args):
        self._log(WARN, msg, args)

    def error(self, msg, *args):
        self._log(ERROR, msg, args)

    def fatal(self, msg, *args):
        self._log(FATAL, msg, args)

_global_log = Log()
log = _global_log.log
debug = _global_log.debug
info = _global_log.info
warn = _global_log.warn
error = _global_log.error
fatal = _global_log.fatal