forked from M-Labs/artiq
1
0
Fork 0

browser: wire up log dock

This commit is contained in:
Robert Jördens 2016-05-20 16:12:02 +02:00
parent af317f9b64
commit 5f7f4ed398
1 changed files with 40 additions and 4 deletions

View File

@ -5,15 +5,16 @@ import asyncio
import atexit import atexit
import os import os
import logging import logging
from functools import partial
from PyQt5 import QtCore, QtGui, QtWidgets from PyQt5 import QtCore, QtGui, QtWidgets
from quamash import QEventLoop from quamash import QEventLoop
from artiq import __artiq_dir__ as artiq_dir from artiq import __artiq_dir__ as artiq_dir
from artiq.tools import verbosity_args, init_logger, atexit_register_coroutine from artiq.tools import verbosity_args, atexit_register_coroutine
from artiq.gui import state, applets, models, log from artiq.gui import state, applets, models, log
from artiq.browser import datasets, files, experiments from artiq.browser import datasets, files, experiments
from artiq.protocols.logging import SourceFilter
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@ -67,12 +68,16 @@ class MainWindow(QtWidgets.QMainWindow):
def main(): def main():
# initialize application # initialize application
args = get_argparser().parse_args() args = get_argparser().parse_args()
init_logger(args)
log_sub = models.LocalModelManager(log.Model)
init_log(args, log_sub)
app = QtWidgets.QApplication(["ARTIQ Browser"]) app = QtWidgets.QApplication(["ARTIQ Browser"])
loop = QEventLoop(app) loop = QEventLoop(app)
asyncio.set_event_loop(loop) asyncio.set_event_loop(loop)
atexit.register(loop.close) atexit.register(loop.close)
loop.call_soon(partial(log_sub.init, []))
smgr = state.StateManager(args.db_file) smgr = state.StateManager(args.db_file)
datasets_sub = models.LocalModelManager(datasets.Model) datasets_sub = models.LocalModelManager(datasets.Model)
@ -100,7 +105,6 @@ def main():
d_datasets = datasets.DatasetsDock(datasets_sub) d_datasets = datasets.DatasetsDock(datasets_sub)
smgr.register(d_datasets) smgr.register(d_datasets)
log_sub = models.LocalModelManager(log.Model)
d_log = log.LogDock(None, "log", log_sub) d_log = log.LogDock(None, "log", log_sub)
d_log.setFeatures(d_log.DockWidgetMovable | d_log.DockWidgetFloatable) d_log.setFeatures(d_log.DockWidgetMovable | d_log.DockWidgetFloatable)
smgr.register(d_log) smgr.register(d_log)
@ -136,5 +140,37 @@ def main():
loop.run_until_complete(main_window.exit_request.wait()) loop.run_until_complete(main_window.exit_request.wait())
class LogBufferHandler(logging.Handler):
def __init__(self, log, *args, **kwargs):
logging.Handler.__init__(self, *args, **kwargs)
self.log = log
self.setFormatter(logging.Formatter("%(name)s:%(message)s"))
def emit(self, record):
if getattr(self.log, "model") is not None:
self.log.model.append((record.levelno, record.source,
record.created, self.format(record)))
def init_log(args, log):
root_logger = logging.getLogger()
root_logger.setLevel(logging.NOTSET) # we use our custom filter only
flt = SourceFilter(logging.WARNING + args.quiet*10 - args.verbose*10,
"browser")
handlers = []
console_handler = logging.StreamHandler()
console_handler.setFormatter(logging.Formatter(
"%(levelname)s:%(source)s:%(name)s:%(message)s"))
handlers.append(console_handler)
buffer_handler = LogBufferHandler(log)
handlers.append(buffer_handler)
for handler in handlers:
handler.addFilter(flt)
root_logger.addHandler(handler)
if __name__ == "__main__": if __name__ == "__main__":
main() main()