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