RFC: add logger that logs into browser console (#4702)

* Option for logging into browser console

* Move import

* Add lint req

* Add docs, use Flask logger
This commit is contained in:
Beto Dealmeida 2018-04-12 21:48:17 -07:00 committed by Maxime Beauchemin
parent 2f5cff7d9f
commit fd84fd89ce
6 changed files with 63 additions and 11 deletions

View File

@ -200,6 +200,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.

View File

@ -5,3 +5,4 @@ psycopg2==2.7.4
redis==2.10.6
statsd==3.2.2
tox==2.9.1
console_log==0.2.10

View File

@ -93,6 +93,7 @@ setup(
],
extras_require={
'cors': ['flask-cors>=2.0.0'],
'console_log': ['console_log==0.2.10'],
},
author='Maxime Beauchemin',
author_email='maximebeauchemin@gmail.com',

View File

@ -78,7 +78,9 @@ for bp in conf.get('BLUEPRINTS'):
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)

View File

@ -14,6 +14,7 @@ from colorama import Fore, Style
from flask_migrate import MigrateCommand
from flask_script import Manager
from pathlib2 import Path
import werkzeug.serving
import yaml
from superset import app, data, db, dict_import_export_util, security_manager, utils
@ -32,9 +33,43 @@ def init():
security_manager.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 console_log import ConsoleLog
from gevent import pywsgi
from geventwebsocket.handler import WebSocketHandler
app.wsgi_app = ConsoleLog(app.wsgi_app, app.logger)
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(
'--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'),
@ -57,9 +92,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. [DEPRECATED]')
def runserver(debug, use_reloader, 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(
@ -68,12 +103,10 @@ def runserver(debug, use_reloader, 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=use_reloader)
if console_log:
console_log_run(app, port, use_reloader)
else:
debug_run(app, port, use_reloader)
else:
logging.info(
"The Gunicorn 'superset runserver' command is deprecated. Please "

View File

@ -746,8 +746,10 @@ class R(BaseSupersetView):
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):