+ # for investigation purposes, can be placed anywhere
+ def log_stack(self,message):
+ to_log="".join(traceback.format_stack())
+ self.debug("%s BEG STACK"%message+"\n"+to_log)
+ self.debug("%s END STACK"%message)
+
+sfa_logger=SfaLogging(logfile='/var/log/sfa.log')
+sfa_import_logger=SfaLogging(logfile='/var/log/sfa_import.log')
+
+
+########################################
+import time
+
+def profile(callable):
+ """
+ Prints the runtime of the specified callable. Use as a decorator, e.g.,
+
+ @profile
+ def foo(...):
+ ...
+
+ Or, equivalently,
+
+ def foo(...):
+ ...
+ foo = profile(foo)
+
+ Or inline:
+
+ result = profile(foo)(...)
+ """
+
+ def wrapper(*args, **kwds):
+ start = time.time()
+ result = callable(*args, **kwds)
+ end = time.time()
+ args = map(str, args)
+ args += ["%s = %s" % (name, str(value)) for (name, value) in kwds.items()]
+ sfa_logger.debug("%s (%s): %.02f s" % (callable.__name__, ", ".join(args), end - start))
+ return result
+
+ return wrapper
+
+if __name__ == '__main__':
+ print 'testing sfalogging into logger.log'
+ global sfa_logger
+ sfa_logger=SfaLogging('logger.log')
+ sfa_logger.critical("logger.critical")
+ sfa_logger.error("logger.error")
+ sfa_logger.warning("logger.warning")
+ sfa_logger.info("logger.info")
+ sfa_logger.debug("logger.debug")
+ sfa_logger.setLevel(logging.DEBUG)
+ sfa_logger.debug("logger.debug again")
+
+ @profile
+ def sleep(seconds = 1):
+ time.sleep(seconds)