diff options
Diffstat (limited to 'wqflask/utility')
-rw-r--r--[-rwxr-xr-x] | wqflask/utility/AJAX_table.py | 2 | ||||
-rw-r--r-- | wqflask/utility/Plot.py | 15 | ||||
-rw-r--r--[-rwxr-xr-x] | wqflask/utility/TDCell.py | 0 | ||||
-rw-r--r--[-rwxr-xr-x] | wqflask/utility/THCell.py | 0 | ||||
-rw-r--r--[-rwxr-xr-x] | wqflask/utility/__init__.py | 0 | ||||
-rw-r--r--[-rwxr-xr-x] | wqflask/utility/after.py | 0 | ||||
-rw-r--r--[-rwxr-xr-x] | wqflask/utility/benchmark.py | 31 | ||||
-rw-r--r--[-rwxr-xr-x] | wqflask/utility/corr_result_helpers.py | 0 | ||||
-rw-r--r--[-rwxr-xr-x] | wqflask/utility/db_tools.py | 0 | ||||
-rw-r--r--[-rwxr-xr-x] | wqflask/utility/formatting.py | 0 | ||||
-rw-r--r--[-rwxr-xr-x] | wqflask/utility/helper_functions.py | 0 | ||||
-rw-r--r-- | wqflask/utility/logger.py | 137 | ||||
-rw-r--r--[-rwxr-xr-x] | wqflask/utility/svg.py | 0 | ||||
-rw-r--r--[-rwxr-xr-x] | wqflask/utility/temp_data.py | 0 | ||||
-rw-r--r-- | wqflask/utility/tools.py | 86 | ||||
-rw-r--r--[-rwxr-xr-x] | wqflask/utility/webqtlUtil.py | 0 |
16 files changed, 234 insertions, 37 deletions
diff --git a/wqflask/utility/AJAX_table.py b/wqflask/utility/AJAX_table.py index 083d1c0d..d70acfcd 100755..100644 --- a/wqflask/utility/AJAX_table.py +++ b/wqflask/utility/AJAX_table.py @@ -68,6 +68,8 @@ class AJAX_table: workbook = xl.Writer('%s.xls' % (webqtlConfig.TMPDIR+file)) worksheet = workbook.add_worksheet() + logger.warning("Creating new MySQLdb cursor (this method is OBSOLETE!)") + con = MySQLdb.Connect(db=webqtlConfig.DB_NAME,host=webqtlConfig.MYSQL_SERVER, user=webqtlConfig.DB_USER,passwd=webqtlConfig.DB_PASSWD) cursor = con.cursor() diff --git a/wqflask/utility/Plot.py b/wqflask/utility/Plot.py index 063de387..d60e2bb2 100644 --- a/wqflask/utility/Plot.py +++ b/wqflask/utility/Plot.py @@ -29,8 +29,6 @@ from __future__ import print_function import piddle as pid from pprint import pformat as pf -print("Lysol") - from math import * import random import sys, os @@ -38,14 +36,15 @@ from numarray import linear_algebra as la from numarray import ones, array, dot, swapaxes import reaper -sys.path.append("..") -print(sys.path) +# sys.path.append("..") Never in a running webserver from basicStatistics import corestats import svg import webqtlUtil from base import webqtlConfig +import utility.logger +logger = utility.logger.getLogger(__name__ ) def cformat(d, rank=0): 'custom string format' @@ -297,10 +296,10 @@ def find_outliers(vals): """ - print("xerxes vals is:", pf(vals)) + logger.debug("xerxes vals is:", pf(vals)) if vals: - #print("vals is:", pf(vals)) + #logger.debug("vals is:", pf(vals)) stats = corestats.Stats(vals) low_hinge = stats.percentile(25) up_hinge = stats.percentile(75) @@ -313,7 +312,7 @@ def find_outliers(vals): upper_bound = None lower_bound = None - print(pf(locals())) + logger.debug(pf(locals())) return upper_bound, lower_bound @@ -436,7 +435,7 @@ def plotBoxPlot(canvas, data, offset= (40, 40, 40, 40), XLabel="Category", YLabe canvas.drawCross(XCoord, plotHeight + yTopOffset - (catMean-Yll)*plotHeight/(Yur - Yll), \ color=pid.blue,size=3) - #print (catMean, catMedian, cat25per, cat75per) + #print(catMean, catMedian, cat25per, cat75per) pass XCoord += stepX diff --git a/wqflask/utility/TDCell.py b/wqflask/utility/TDCell.py index 8de8e050..8de8e050 100755..100644 --- a/wqflask/utility/TDCell.py +++ b/wqflask/utility/TDCell.py diff --git a/wqflask/utility/THCell.py b/wqflask/utility/THCell.py index dde221b5..dde221b5 100755..100644 --- a/wqflask/utility/THCell.py +++ b/wqflask/utility/THCell.py diff --git a/wqflask/utility/__init__.py b/wqflask/utility/__init__.py index d9856eed..d9856eed 100755..100644 --- a/wqflask/utility/__init__.py +++ b/wqflask/utility/__init__.py diff --git a/wqflask/utility/after.py b/wqflask/utility/after.py index a3bb85e9..a3bb85e9 100755..100644 --- a/wqflask/utility/after.py +++ b/wqflask/utility/after.py diff --git a/wqflask/utility/benchmark.py b/wqflask/utility/benchmark.py index d5b32703..8c97370d 100755..100644 --- a/wqflask/utility/benchmark.py +++ b/wqflask/utility/benchmark.py @@ -3,34 +3,39 @@ from __future__ import print_function, division, absolute_import import collections import inspect import time +from utility.tools import LOG_BENCH +from utility.logger import getLogger +logger = getLogger(__name__ ) class Bench(object): entries = collections.OrderedDict() - def __init__(self, name=None): + def __init__(self, name=None, write_output=True): self.name = name + self.write_output = write_output def __enter__(self): - if self.name: - print("Starting benchmark: %s" % (self.name)) - else: - print("Starting benchmark at: %s [%i]" % (inspect.stack()[1][3], inspect.stack()[1][2])) + if self.write_output: + if self.name: + logger.debug("Starting benchmark: %s" % (self.name)) + else: + logger.debug("Starting benchmark at: %s [%i]" % (inspect.stack()[1][3], inspect.stack()[1][2])) self.start_time = time.time() def __exit__(self, type, value, traceback): - if self.name: - name = self.name - else: - name = "That" - time_taken = time.time() - self.start_time - print(" %s took: %f seconds" % (name, (time_taken))) + if self.write_output: + if self.name: + name = self.name + else: + name = "That" + + logger.info(" %s took: %f seconds" % (name, (time_taken))) if self.name: Bench.entries[self.name] = Bench.entries.get(self.name, 0) + time_taken - @classmethod def report(cls): total_time = sum((time_taken for time_taken in cls.entries.itervalues())) @@ -42,4 +47,4 @@ class Bench(object): def reset(cls): """Reset the entries""" - cls.entries = collections.OrderedDict()
\ No newline at end of file + cls.entries = collections.OrderedDict() diff --git a/wqflask/utility/corr_result_helpers.py b/wqflask/utility/corr_result_helpers.py index ef644d85..ef644d85 100755..100644 --- a/wqflask/utility/corr_result_helpers.py +++ b/wqflask/utility/corr_result_helpers.py diff --git a/wqflask/utility/db_tools.py b/wqflask/utility/db_tools.py index 4034f39c..4034f39c 100755..100644 --- a/wqflask/utility/db_tools.py +++ b/wqflask/utility/db_tools.py diff --git a/wqflask/utility/formatting.py b/wqflask/utility/formatting.py index e53dda22..e53dda22 100755..100644 --- a/wqflask/utility/formatting.py +++ b/wqflask/utility/formatting.py diff --git a/wqflask/utility/helper_functions.py b/wqflask/utility/helper_functions.py index 15f60765..15f60765 100755..100644 --- a/wqflask/utility/helper_functions.py +++ b/wqflask/utility/helper_functions.py diff --git a/wqflask/utility/logger.py b/wqflask/utility/logger.py new file mode 100644 index 00000000..86ee1c52 --- /dev/null +++ b/wqflask/utility/logger.py @@ -0,0 +1,137 @@ +# GeneNetwork logger +# +# The standard python logging module is very good. This logger adds a +# few facilities on top of that. Main one being that it picks up +# settings for log levels (global and by module) and (potentially) +# offers some fine grained log levels for the standard levels. +# +# All behaviour is defined here. Global settings (defined in +# default_settings.py). +# +# To use logging and settings put this at the top of a module: +# +# import utility.logger +# logger = utility.logger.getLogger(__name__ ) +# +# To override global behaviour set the LOG_LEVEL in default_settings.py +# or use an environment variable, e.g. +# +# env LOG_LEVEL=INFO ./bin/genenetwork2 +# +# To override log level for a module replace that with, for example, +# +# import logging +# import utility.logger +# logger = utility.logger.getLogger(__name__,level=logging.DEBUG) +# +# We'll add more overrides soon. + +import logging +import string +from inspect import isfunction +from pprint import pformat as pf +from inspect import stack + +from utility.tools import LOG_LEVEL, LOG_LEVEL_DEBUG, LOG_SQL, LOG_FORMAT + +class GNLogger: + """A logger class with some additional functionality, such as + multiple parameter logging, SQL logging, timing, colors, and lazy + functions. + + """ + + def __init__(self,name): + self.logger = logging.getLogger(name) + + def setLevel(self,value): + """Set the undelying log level""" + self.logger.setLevel(value) + + def debug(self,level=0,*args): + """Call logging.debug for multiple args. Use level=num to filter on +LOG_LEVEL_DEBUG. + + """ + if level <= LOG_LEVEL_DEBUG: + self.collect(self.logger.debug,*args) + + def info(self,*args): + """Call logging.info for multiple args""" + self.collect(self.logger.info,*args) + + def warning(self,*args): + """Call logging.warning for multiple args""" + self.collect(self.logger.warning,*args) + self.logger.warning(self.collect(*args)) + + def error(self,*args): + """Call logging.error for multiple args""" + self.collect(self.logger.error,*args) + + def infof(self,*args): + """Call logging.info for multiple args lazily""" + # only evaluate function when logging + if self.logger.getEffectiveLevel() < 30: + self.collectf(self.logger.debug,*args) + + def debugf(self,level=0,*args): + """Call logging.debug for multiple args lazily""" + # only evaluate function when logging + if level <= LOG_LEVEL_DEBUG: + if self.logger.getEffectiveLevel() < 20: + self.collectf(self.logger.debug,*args) + + def sql(self, sqlcommand, fun = None): + """Log SQL command, optionally invoking a timed fun""" + if LOG_SQL: + caller = stack()[1][3] + if caller in ['fetchone','fetch1','fetchall']: + caller = stack()[2][3] + self.info(caller,sqlcommand) + if fun: + result = fun(sqlcommand) + if LOG_SQL: + self.info(result) + return result + + def collect(self,fun,*args): + """Collect arguments and use fun to output""" + out = "."+stack()[2][3] + for a in args: + if len(out)>1: + out += ": " + if isinstance(a, str): + out = out + a + else: + out = out + pf(a,width=160) + fun(out) + + def collectf(self,fun,*args): + """Collect arguments and use fun to output one by one""" + out = "."+stack()[2][3] + for a in args: + if len(out)>1: + out += ": " + if isfunction(a): + out += a() + else: + if isinstance(a, str): + out = out + a + else: + out = out + pf(a,width=160) + fun(out) + +# Get the module logger. You can override log levels at the +# module level +def getLogger(name, level = None): + gnlogger = GNLogger(name) + logger = gnlogger.logger + + if level: + logger.setLevel(level) + else: + logger.setLevel(LOG_LEVEL) + + logger.info("Log level of "+name+" set to "+logging.getLevelName(logger.getEffectiveLevel())) + return gnlogger diff --git a/wqflask/utility/svg.py b/wqflask/utility/svg.py index 512bc9e6..512bc9e6 100755..100644 --- a/wqflask/utility/svg.py +++ b/wqflask/utility/svg.py diff --git a/wqflask/utility/temp_data.py b/wqflask/utility/temp_data.py index 5bf700c9..5bf700c9 100755..100644 --- a/wqflask/utility/temp_data.py +++ b/wqflask/utility/temp_data.py diff --git a/wqflask/utility/tools.py b/wqflask/utility/tools.py index 11441d7a..bb8241f5 100644 --- a/wqflask/utility/tools.py +++ b/wqflask/utility/tools.py @@ -5,14 +5,18 @@ import os import sys from wqflask import app +# Use the standard logger here to avoid a circular dependency +import logging +logger = logging.getLogger(__name__ ) + def get_setting(command_id,guess=None): """Resolve a setting from the environment or the global settings in - app.config, with get_valid_path is a function checking whether the + app.config, with valid_path is a function checking whether the path points to an expected directory and returns the full path to the binary command guess = os.environ.get('HOME')+'/pylmm' - get_setting('PYLMM_PATH',guess) + valid_path(get_setting('PYLMM_PATH',guess)) first tries the environment variable in +id+, next gets the Flask app setting for the same +id+ and finally does an educated @@ -31,23 +35,39 @@ def get_setting(command_id,guess=None): """ def value(command): if command: - sys.stderr.write("Found path "+command+"\n") + # sys.stderr.write("Found "+command+"\n") return command else: return None # ---- Check whether environment exists - sys.stderr.write("Looking for "+command_id+"\n") + logger.debug("Looking for "+command_id+"\n") command = value(os.environ.get(command_id)) - if not command: + if command is None or command == "": # ---- Check whether setting exists in app command = value(app.config.get(command_id)) - if not command: + if command is None: command = value(guess) - if not command: - raise Exception(command_id+' path unknown or faulty (update settings.py?). '+command_id+' should point to the path') + if command is None or command == "": + print command + raise Exception(command_id+' setting unknown or faulty (update default_settings.py?).') + logger.debug("Set "+command_id+"="+str(command)) return command +def get_setting_bool(id): + v = get_setting(id) + if v not in [0,False,'False','FALSE',None]: + return True + return False + +def get_setting_int(id): + v = get_setting(id) + if isinstance(v, str): + return int(v) + if v is None: + return 0 + return v + def valid_bin(bin): if os.path.islink(bin) or valid_file(bin): return bin @@ -100,7 +120,7 @@ def locate(name, subdir=None): if valid_path(base): lookfor = base + "/" + name if valid_file(lookfor): - print("Found: file "+lookfor+"\n") + logger.info("Found: file "+lookfor+"\n") return lookfor else: raise Exception("Can not locate "+lookfor) @@ -120,18 +140,52 @@ def locate_ignore_error(name, subdir=None): if valid_path(base): lookfor = base + "/" + name if valid_file(lookfor): - print("Found: file "+name+"\n") + logger.debug("Found: file "+name+"\n") return lookfor - sys.stderr.write("WARNING: file "+name+" not found\n") + logger.info("WARNING: file "+name+" not found\n") return None def tempdir(): return valid_path(get_setting("TEMPDIR","/tmp")) +BLUE = '\033[94m' +GREEN = '\033[92m' +BOLD = '\033[1m' +ENDC = '\033[0m' + +def show_settings(): + from utility.tools import LOG_LEVEL + + print("Set global log level to "+BLUE+LOG_LEVEL+ENDC) + log_level = getattr(logging, LOG_LEVEL.upper()) + logging.basicConfig(level=log_level) + + logger.info(BLUE+"Mr. Mojo Risin 2"+ENDC) + print "runserver.py: ****** The webserver has the following configuration ******" + keylist = app.config.keys() + keylist.sort() + for k in keylist: + try: + print("%s %s%s%s%s" % (k,BLUE,BOLD,get_setting(k),ENDC)) + except: + print("%s %s%s%s%s" % (k,GREEN,BOLD,app.config[k],ENDC)) + # Cached values -PYLMM_COMMAND = pylmm_command() -GEMMA_COMMAND = gemma_command() -PLINK_COMMAND = plink_command() -FLAT_FILES = flat_files() -TEMPDIR = tempdir() +WEBSERVER_MODE = get_setting('WEBSERVER_MODE') +GN_SERVER_URL = get_setting('GN_SERVER_URL') +SQL_URI = get_setting('SQL_URI') +LOG_LEVEL = get_setting('LOG_LEVEL') +LOG_LEVEL_DEBUG = get_setting_int('LOG_LEVEL_DEBUG') +LOG_SQL = get_setting_bool('LOG_SQL') +LOG_SQLALCHEMY = get_setting_bool('LOG_SQLALCHEMY') +LOG_BENCH = get_setting_bool('LOG_BENCH') +LOG_FORMAT = "%(message)s" # not yet in use +USE_REDIS = get_setting_bool('USE_REDIS') +USE_GN_SERVER = get_setting_bool('USE_GN_SERVER') + +PYLMM_COMMAND = pylmm_command() +GEMMA_COMMAND = gemma_command() +PLINK_COMMAND = plink_command() +FLAT_FILES = flat_files() +TEMPDIR = tempdir() diff --git a/wqflask/utility/webqtlUtil.py b/wqflask/utility/webqtlUtil.py index 4fc978f5..4fc978f5 100755..100644 --- a/wqflask/utility/webqtlUtil.py +++ b/wqflask/utility/webqtlUtil.py |