# # Copyright 2012 - 2013 David Sommerseth # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. # # For the avoidance of doubt the "preferred form" of this code is one which # is in an open unpatent encumbered format. Where cryptographic key signing # forms part of the process of creating an executable the information # including keys needed to generate an equivalently functional executable # are deemed to be part of the source code. # import sys class Log(object): NONE = 0 ALWAYS = 0 INFO = 1<<0 WARN = 1<<1 ERR = 1<<2 DEBUG = 1<<3 def __init__(self, logfile=None): if logfile is not None: self.__logfile = open(logfile, "w") else: self.__logfile = sys.stdout self.__logverb = self.INFO def __logtype_str(self, ltype): if ltype == self.ALWAYS: return "" if ltype == self.INFO: return "[INFO] " elif ltype == self.WARN: return "[WARNING] " elif ltype == self.ERR: return "[ERROR] " elif ltype == self.DEBUG: return "[DEBUG] " def SetLogVerbosity(self, logverb): self.__logverb = logverb def log(self, logtype, msg): if (logtype & self.__logverb) or logtype == self.ALWAYS: self.__logfile.write("%s%s\n" % (self.__logtype_str(logtype), msg) ) def unit_test(rootdir): from itertools import takewhile, count logtypes = (Log.ALWAYS, Log.INFO, Log.WARN, Log.ERR, Log.DEBUG) logtypes_s = ("ALWAYS", "INFO", "WARN", "ERR", "DEBUG") def test_log(l, msg): for lt in logtypes: l.log(lt, msg) def run_log_test(l): for lt in range(min(logtypes), max(logtypes)*2): test = ", ".join([logtypes_s[logtypes.index(i)] for i in [p for p in takewhile(lambda x: x <= lt, (2**i for i in count())) if p & lt]]) print "Testing verbosity flags set to: (%i) %s" % (lt, test) msg = "Log entry when verbosity is set to %i [%s]" % (lt, test) l.SetLogVerbosity(lt) test_log(l, msg) print "-"*20 try: print "** Testing stdout" l = Log() run_log_test(l) print "** Testing file logging - using test.log" l = Log("test.log") run_log_test(l) return 0 except Exception, e: import traceback traceback.print_exc(file=sys.stdout) print "** EXCEPTION %s", str(e) return 1 if __name__ == '__main__': unit_test(None)