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:
parent
2f5cff7d9f
commit
fd84fd89ce
|
|
@ -200,6 +200,19 @@ Check the [OS dependencies](https://superset.incubator.apache.org/installation.h
|
||||||
superset runserver -d
|
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
|
## Setting up the node / npm javascript environment
|
||||||
|
|
||||||
`superset/assets` contains all npm-managed, front end assets.
|
`superset/assets` contains all npm-managed, front end assets.
|
||||||
|
|
|
||||||
|
|
@ -5,3 +5,4 @@ psycopg2==2.7.4
|
||||||
redis==2.10.6
|
redis==2.10.6
|
||||||
statsd==3.2.2
|
statsd==3.2.2
|
||||||
tox==2.9.1
|
tox==2.9.1
|
||||||
|
console_log==0.2.10
|
||||||
|
|
|
||||||
1
setup.py
1
setup.py
|
|
@ -93,6 +93,7 @@ setup(
|
||||||
],
|
],
|
||||||
extras_require={
|
extras_require={
|
||||||
'cors': ['flask-cors>=2.0.0'],
|
'cors': ['flask-cors>=2.0.0'],
|
||||||
|
'console_log': ['console_log==0.2.10'],
|
||||||
},
|
},
|
||||||
author='Maxime Beauchemin',
|
author='Maxime Beauchemin',
|
||||||
author_email='maximebeauchemin@gmail.com',
|
author_email='maximebeauchemin@gmail.com',
|
||||||
|
|
|
||||||
|
|
@ -78,7 +78,9 @@ for bp in conf.get('BLUEPRINTS'):
|
||||||
if conf.get('SILENCE_FAB'):
|
if conf.get('SILENCE_FAB'):
|
||||||
logging.getLogger('flask_appbuilder').setLevel(logging.ERROR)
|
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.
|
# In production mode, add log handler to sys.stderr.
|
||||||
app.logger.addHandler(logging.StreamHandler())
|
app.logger.addHandler(logging.StreamHandler())
|
||||||
app.logger.setLevel(logging.INFO)
|
app.logger.setLevel(logging.INFO)
|
||||||
|
|
|
||||||
|
|
@ -14,6 +14,7 @@ from colorama import Fore, Style
|
||||||
from flask_migrate import MigrateCommand
|
from flask_migrate import MigrateCommand
|
||||||
from flask_script import Manager
|
from flask_script import Manager
|
||||||
from pathlib2 import Path
|
from pathlib2 import Path
|
||||||
|
import werkzeug.serving
|
||||||
import yaml
|
import yaml
|
||||||
|
|
||||||
from superset import app, data, db, dict_import_export_util, security_manager, utils
|
from superset import app, data, db, dict_import_export_util, security_manager, utils
|
||||||
|
|
@ -32,9 +33,43 @@ def init():
|
||||||
security_manager.sync_role_definitions()
|
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(
|
@manager.option(
|
||||||
'-d', '--debug', action='store_true',
|
'-d', '--debug', action='store_true',
|
||||||
help='Start the web server in debug mode')
|
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(
|
@manager.option(
|
||||||
'-n', '--no-reload', action='store_false', dest='use_reloader',
|
'-n', '--no-reload', action='store_false', dest='use_reloader',
|
||||||
default=config.get('FLASK_USE_RELOAD'),
|
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. '
|
help='Path to a UNIX socket as an alternative to address:port, e.g. '
|
||||||
'/var/run/superset.sock. '
|
'/var/run/superset.sock. '
|
||||||
'Will override the address and port values. [DEPRECATED]')
|
'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."""
|
"""Starts a Superset web server."""
|
||||||
debug = debug or config.get('DEBUG')
|
debug = debug or config.get('DEBUG') or console_log
|
||||||
if debug:
|
if debug:
|
||||||
print(Fore.BLUE + '-=' * 20)
|
print(Fore.BLUE + '-=' * 20)
|
||||||
print(
|
print(
|
||||||
|
|
@ -68,12 +103,10 @@ def runserver(debug, use_reloader, address, port, timeout, workers, socket):
|
||||||
Fore.YELLOW + ' mode')
|
Fore.YELLOW + ' mode')
|
||||||
print(Fore.BLUE + '-=' * 20)
|
print(Fore.BLUE + '-=' * 20)
|
||||||
print(Style.RESET_ALL)
|
print(Style.RESET_ALL)
|
||||||
app.run(
|
if console_log:
|
||||||
host='0.0.0.0',
|
console_log_run(app, port, use_reloader)
|
||||||
port=int(port),
|
else:
|
||||||
threaded=True,
|
debug_run(app, port, use_reloader)
|
||||||
debug=True,
|
|
||||||
use_reloader=use_reloader)
|
|
||||||
else:
|
else:
|
||||||
logging.info(
|
logging.info(
|
||||||
"The Gunicorn 'superset runserver' command is deprecated. Please "
|
"The Gunicorn 'superset runserver' command is deprecated. Please "
|
||||||
|
|
|
||||||
|
|
@ -746,8 +746,10 @@ class R(BaseSupersetView):
|
||||||
obj = models.Url(url=url)
|
obj = models.Url(url=url)
|
||||||
db.session.add(obj)
|
db.session.add(obj)
|
||||||
db.session.commit()
|
db.session.commit()
|
||||||
return('http://{request.headers[Host]}/{directory}?r={obj.id}'.format(
|
return Response(
|
||||||
request=request, directory=directory, obj=obj))
|
'http://{request.headers[Host]}/{directory}?r={obj.id}'.format(
|
||||||
|
request=request, directory=directory, obj=obj),
|
||||||
|
mimetype='text/plain')
|
||||||
|
|
||||||
@expose('/msg/')
|
@expose('/msg/')
|
||||||
def msg(self):
|
def msg(self):
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue