From 563b09a52a1721112b300fbef4a42f8e2745afa0 Mon Sep 17 00:00:00 2001 From: Beto Dealmeida Date: Wed, 28 Mar 2018 10:30:17 -0700 Subject: [PATCH 1/4] Option for logging into browser console --- setup.py | 1 + superset/cli.py | 53 +++++++++++++++++++++++++++++++++++------- superset/views/core.py | 6 +++-- 3 files changed, 49 insertions(+), 11 deletions(-) diff --git a/setup.py b/setup.py index bdb0d5e42abf0..baaaf48720ad5 100644 --- a/setup.py +++ b/setup.py @@ -93,6 +93,7 @@ def get_git_sha(): ], extras_require={ 'cors': ['Flask-Cors>=2.0.0'], + 'console_log': ['console_log==0.2.10'], }, tests_require=[ 'coverage', diff --git a/superset/cli.py b/superset/cli.py index 48db7394b9dae..c6a32d2832775 100755 --- a/superset/cli.py +++ b/superset/cli.py @@ -11,9 +11,11 @@ from sys import stdout from colorama import Fore, Style +from console_log import ConsoleLog from flask_migrate import MigrateCommand from flask_script import Manager from pathlib2 import Path +import werkzeug.serving import yaml from superset import app, db, dict_import_export_util, security, utils @@ -31,11 +33,46 @@ def init(): security.sync_role_definitions() +def debug_run(app, port, use_reloader): + return app.run( + host='0.0.0.0', + port=int(port), + threaded=True, + debug=True, + use_reloader=use_reloader) + + +def console_log_run(app, port, use_reloader): + from gevent import pywsgi + from geventwebsocket.handler import WebSocketHandler + + console = logging.getLogger('console') + console.setLevel(logging.DEBUG) + app.wsgi_app = ConsoleLog(app.wsgi_app, console) + + def run(): + server = pywsgi.WSGIServer( + ('0.0.0.0', int(port)), + app, + handler_class=WebSocketHandler) + server.serve_forever() + + if use_reloader: + from gevent import monkey + monkey.patch_all() + run = werkzeug.serving.run_with_reloader(run) + + run() + + @manager.option( '-d', '--debug', action='store_true', help='Start the web server in debug mode') @manager.option( - '-n', '--no-reload', action='store_false', dest='no_reload', + '--console-log', action='store_true', + help='Create logger that logs to the browser console (implies -d)') +@manager.option( + '-n', '--no-reload', action='store_false', dest='use_reloader', default=config.get('FLASK_USE_RELOAD'), help="Don't use the reloader in debug mode") @manager.option( @@ -56,9 +93,9 @@ def init(): help='Path to a UNIX socket as an alternative to address:port, e.g. ' '/var/run/superset.sock. ' 'Will override the address and port values.') -def runserver(debug, no_reload, address, port, timeout, workers, socket): +def runserver(debug, console_log, use_reloader, address, port, timeout, workers, socket): """Starts a Superset web server.""" - debug = debug or config.get('DEBUG') + debug = debug or config.get('DEBUG') or console_log if debug: print(Fore.BLUE + '-=' * 20) print( @@ -67,12 +104,10 @@ def runserver(debug, no_reload, address, port, timeout, workers, socket): Fore.YELLOW + ' mode') print(Fore.BLUE + '-=' * 20) print(Style.RESET_ALL) - app.run( - host='0.0.0.0', - port=int(port), - threaded=True, - debug=True, - use_reloader=no_reload) + if console_log: + console_log_run(app, port, use_reloader) + else: + debug_run(app, port, use_reloader) else: addr_str = ' unix:{socket} ' if socket else' {address}:{port} ' cmd = ( diff --git a/superset/views/core.py b/superset/views/core.py index 723e8ccfb7a75..8a985775756bd 100755 --- a/superset/views/core.py +++ b/superset/views/core.py @@ -747,8 +747,10 @@ def shortner(self): obj = models.Url(url=url) db.session.add(obj) db.session.commit() - return('http://{request.headers[Host]}/{directory}?r={obj.id}'.format( - request=request, directory=directory, obj=obj)) + return Response( + 'http://{request.headers[Host]}/{directory}?r={obj.id}'.format( + request=request, directory=directory, obj=obj), + mimetype='text/plain') @expose('/msg/') def msg(self): From 25e578ea2317c913108d9104fcc5eb86300e07f6 Mon Sep 17 00:00:00 2001 From: Beto Dealmeida Date: Wed, 28 Mar 2018 10:33:01 -0700 Subject: [PATCH 2/4] Move import --- superset/cli.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/superset/cli.py b/superset/cli.py index c6a32d2832775..a019cf20a7732 100755 --- a/superset/cli.py +++ b/superset/cli.py @@ -11,7 +11,6 @@ from sys import stdout from colorama import Fore, Style -from console_log import ConsoleLog from flask_migrate import MigrateCommand from flask_script import Manager from pathlib2 import Path @@ -43,6 +42,7 @@ def debug_run(app, port, use_reloader): def console_log_run(app, port, use_reloader): + from console_log import ConsoleLog from gevent import pywsgi from geventwebsocket.handler import WebSocketHandler From 6746d4336297b7b735abc70e209a4e854eb79f30 Mon Sep 17 00:00:00 2001 From: Beto Dealmeida Date: Wed, 28 Mar 2018 12:18:17 -0700 Subject: [PATCH 3/4] Add lint req --- dev-reqs.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/dev-reqs.txt b/dev-reqs.txt index b565fbdf23254..80604445c5e4a 100644 --- a/dev-reqs.txt +++ b/dev-reqs.txt @@ -10,5 +10,6 @@ pylint pyyaml redis statsd +console_log # Also install everything we need to build Sphinx docs -r dev-reqs-for-docs.txt From d976ab255d8b250314744ab36058de2ac975fcee Mon Sep 17 00:00:00 2001 From: Beto Dealmeida Date: Wed, 28 Mar 2018 16:11:02 -0700 Subject: [PATCH 4/4] Add docs, use Flask logger --- CONTRIBUTING.md | 13 +++++++++++++ superset/__init__.py | 4 +++- superset/cli.py | 4 +--- 3 files changed, 17 insertions(+), 4 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index b337dad4d8c78..8f662226dad83 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -195,6 +195,19 @@ Check the [OS dependencies](https://superset.incubator.apache.org/installation.h superset runserver -d +### Logging to the browser console + +When debugging your application, you can have the server logs sent directly to the browser console: + + superset runserver -d --console-log + +You can log anything to the browser console, including objects: + + from superset import app + app.logger.error('An exception occurred!') + app.logger.info(form_data) + + ## Setting up the node / npm javascript environment `superset/assets` contains all npm-managed, front end assets. diff --git a/superset/__init__.py b/superset/__init__.py index d420b764f3f7d..e236bbf06271b 100644 --- a/superset/__init__.py +++ b/superset/__init__.py @@ -77,7 +77,9 @@ def get_js_manifest(): if conf.get('SILENCE_FAB'): logging.getLogger('flask_appbuilder').setLevel(logging.ERROR) -if not app.debug: +if app.debug: + app.logger.setLevel(logging.DEBUG) +else: # In production mode, add log handler to sys.stderr. app.logger.addHandler(logging.StreamHandler()) app.logger.setLevel(logging.INFO) diff --git a/superset/cli.py b/superset/cli.py index a019cf20a7732..47cc046bdb1bd 100755 --- a/superset/cli.py +++ b/superset/cli.py @@ -46,9 +46,7 @@ def console_log_run(app, port, use_reloader): from gevent import pywsgi from geventwebsocket.handler import WebSocketHandler - console = logging.getLogger('console') - console.setLevel(logging.DEBUG) - app.wsgi_app = ConsoleLog(app.wsgi_app, console) + app.wsgi_app = ConsoleLog(app.wsgi_app, app.logger) def run(): server = pywsgi.WSGIServer(