Skip to content

Commit

Permalink
log: use broadcast instead of sync_struct, filter on new messages only (
Browse files Browse the repository at this point in the history
sbourdeauducq committed May 28, 2016
1 parent 4d6f53c commit 10267f3
Showing 7 changed files with 90 additions and 129 deletions.
21 changes: 12 additions & 9 deletions artiq/browser/log.py
Original file line number Diff line number Diff line change
@@ -3,19 +3,20 @@
from artiq.protocols.logging import SourceFilter


class LogBufferHandler(logging.Handler):
def __init__(self, log, *args, **kwargs):
class LogWidgetHandler(logging.Handler):
def __init__(self, *args, **kwargs):
logging.Handler.__init__(self, *args, **kwargs)
self.log = log
self.log_widget = None
self.setFormatter(logging.Formatter("%(name)s:%(message)s"))

def emit(self, record):
if self.log.model is not None:
self.log.model.append((record.levelno, record.source,
record.created, self.format(record)))
if self.log_widget is not None:
message = self.format(record)
self.log_widget.append_message((record.levelno, record.source,
record.created, message))


def init_log(args, log):
def init_log(args):
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,
@@ -26,9 +27,11 @@ def init_log(args, log):
"%(levelname)s:%(source)s:%(name)s:%(message)s"))
handlers.append(console_handler)

buffer_handler = LogBufferHandler(log)
handlers.append(buffer_handler)
widget_handler = LogWidgetHandler()
handlers.append(widget_handler)

for handler in handlers:
handler.addFilter(flt)
root_logger.addHandler(handler)

return widget_handler
12 changes: 5 additions & 7 deletions artiq/frontend/artiq_browser.py
Original file line number Diff line number Diff line change
@@ -37,7 +37,7 @@ def get_argparser():


class Browser(QtWidgets.QMainWindow):
def __init__(self, datasets_sub, log_sub, browse_root, select):
def __init__(self, datasets_sub, browse_root, select):
QtWidgets.QMainWindow.__init__(self)

icon = QtGui.QIcon(os.path.join(artiq_dir, "gui", "logo.svg"))
@@ -66,7 +66,7 @@ def __init__(self, datasets_sub, log_sub, browse_root, select):

self.datasets = datasets.DatasetsDock(datasets_sub)

self.log = log.LogDock(None, "log", log_sub)
self.log = log.LogDock(None, "log")
self.log.setFeatures(self.log.DockWidgetMovable |
self.log.DockWidgetFloatable)

@@ -127,17 +127,15 @@ def main():
asyncio.set_event_loop(loop)
atexit.register(loop.close)

log_sub = models.LocalModelManager(log.Model)
browser_log.init_log(args, log_sub)
log_sub.init([])
widget_log_handler = browser_log.init_log(args)

datasets_sub = models.LocalModelManager(datasets.Model)
datasets_sub.init({})

smgr = state.StateManager(args.db_file)

main_window = Browser(datasets_sub, log_sub,
args.browse_root, args.select)
main_window = Browser(datasets_sub, args.browse_root, args.select)
widget_log_handler.log_widget = main_window.log
smgr.register(main_window)

if os.name == "nt":
15 changes: 12 additions & 3 deletions artiq/frontend/artiq_dashboard.py
Original file line number Diff line number Diff line change
@@ -11,6 +11,7 @@
from artiq import __artiq_dir__ as artiq_dir
from artiq.tools import *
from artiq.protocols.pc_rpc import AsyncioClient
from artiq.protocols.broadcast import Receiver
from artiq.gui.models import ModelSubscriber
from artiq.gui import state, applets, log
from artiq.dashboard import (experiments, shortcuts, explorer,
@@ -33,6 +34,9 @@ def get_argparser():
parser.add_argument(
"--port-control", default=3251, type=int,
help="TCP port to connect to for control")
parser.add_argument(
"--port-broadcast", default=1067, type=int,
help="TCP port to connect to for broadcasts")
parser.add_argument(
"--db-file", default=default_db_file,
help="database file for local GUI settings "
@@ -106,14 +110,18 @@ def main():
for notifier_name, modelf in (("explist", explorer.Model),
("explist_status", explorer.StatusUpdater),
("datasets", datasets.Model),
("schedule", schedule.Model),
("log", log.Model)):
("schedule", schedule.Model)):
subscriber = ModelSubscriber(notifier_name, modelf)
loop.run_until_complete(subscriber.connect(
args.server, args.port_notify))
atexit_register_coroutine(subscriber.close)
sub_clients[notifier_name] = subscriber

log_receiver = Receiver("log", [])
loop.run_until_complete(log_receiver.connect(
args.server, args.port_broadcast))
atexit_register_coroutine(log_receiver.close)

# initialize main window
main_window = MainWindow(args.server)
smgr.register(main_window)
@@ -156,8 +164,9 @@ def main():
status_bar, rpc_clients["schedule"], sub_clients["schedule"])
smgr.register(d_schedule)

logmgr = log.LogDockManager(main_window, sub_clients["log"])
logmgr = log.LogDockManager(main_window)
smgr.register(logmgr)
log_receiver.notify_cbs.append(logmgr.append_message)

# lay out docks
right_docks = [
20 changes: 14 additions & 6 deletions artiq/frontend/artiq_master.py
Original file line number Diff line number Diff line change
@@ -11,6 +11,7 @@
from artiq.protocols.pc_rpc import Server as RPCServer
from artiq.protocols.sync_struct import Publisher
from artiq.protocols.logging import Server as LoggingServer
from artiq.protocols.broadcast import Broadcaster
from artiq.master.log import log_args, init_log
from artiq.master.databases import DeviceDB, DatasetDB
from artiq.master.scheduler import Scheduler
@@ -27,7 +28,8 @@ def get_argparser():
simple_network_args(parser, [
("notify", "notifications", 3250),
("control", "control", 3251),
("logging", "remote logging", 1066)
("logging", "remote logging", 1066),
("broadcast", "broadcasts", 1067)
])

group = parser.add_argument_group("databases")
@@ -51,13 +53,22 @@ def get_argparser():

def main():
args = get_argparser().parse_args()
log_buffer = init_log(args)
log_forwarder = init_log(args)
if os.name == "nt":
loop = asyncio.ProactorEventLoop()
asyncio.set_event_loop(loop)
else:
loop = asyncio.get_event_loop()
atexit.register(loop.close)
bind = bind_address_from_args(args)

server_broadcast = Broadcaster()
loop.run_until_complete(server_broadcast.start(
bind, args.port_broadcast))
atexit_register_coroutine(server_broadcast.stop)

log_forwarder.callback = (lambda msg:
server_broadcast.broadcast("log", msg))

device_db = DeviceDB(args.device_db)
dataset_db = DatasetDB(args.dataset_db)
@@ -88,8 +99,6 @@ def main():
})
experiment_db.scan_repository_async()

bind = bind_address_from_args(args)

server_control = RPCServer({
"master_device_db": device_db,
"master_dataset_db": dataset_db,
@@ -105,8 +114,7 @@ def main():
"devices": device_db.data,
"datasets": dataset_db.data,
"explist": experiment_db.explist,
"explist_status": experiment_db.status,
"log": log_buffer.data
"explist_status": experiment_db.status
})
loop.run_until_complete(server_notify.start(
bind, args.port_notify))
Loading

0 comments on commit 10267f3

Please sign in to comment.