1import time 2import logging 3 4from gi.repository import GObject, GLib 5 6 7class LogEmitter(GObject.GObject): 8 __gsignals__ = { 9 "logged": (GObject.SignalFlags.RUN_FIRST, None, (object, )) 10 } # list of (str, float, str, int) 11 12 def __init__(self): 13 GObject.GObject.__init__(self) 14 15 # We store everything in this list, so that the LogDialog, which is 16 # imported a little later, will have all data ever given to Log. 17 # When Dialog inits, it will set this list to None, and we will stop 18 # appending data to it. Ugly? Somewhat I guess. 19 self.messages = [] 20 21 22class GLogHandler(logging.Handler): 23 def __init__(self, emitter): 24 logging.Handler.__init__(self) 25 self.emitter = emitter 26 27 def emit(self, record): 28 def _emit(record): 29 message = self.format(record) 30 if self.emitter.messages is not None: 31 self.emitter.messages.append((record.task, time.time(), message, 32 record.levelno)) 33 34 self.emitter.emit("logged", 35 (record.task, time.time(), message, record.levelno)) 36 GLib.idle_add(_emit, record) 37 38 39logemitter = LogEmitter() 40