commit 7ba579494215a5353cff1db9fbf7e59d6b666af9 Author: Damian Johnson atagar@torproject.org Date: Mon Nov 5 09:14:07 2012 -0800
Support for logging events
Adding an event class for DEBUG, INFO, NOTICE, WARN, and ERR. --- docs/api/response.rst | 1 + stem/control.py | 15 ++++++++++----- stem/response/events.py | 27 +++++++++++++++++++++++++++ test/unit/response/events.py | 19 +++++++++++++++++++ 4 files changed, 57 insertions(+), 5 deletions(-)
diff --git a/docs/api/response.rst b/docs/api/response.rst index 6e23c91..fd6e2cc 100644 --- a/docs/api/response.rst +++ b/docs/api/response.rst @@ -16,5 +16,6 @@ Events ------
.. autoclass:: stem.response.events.Event +.. autoclass:: stem.response.events.LogEvent .. autoclass:: stem.response.events.BandwidthEvent
diff --git a/stem/control.py b/stem/control.py index f9f7def..baeb96e 100644 --- a/stem/control.py +++ b/stem/control.py @@ -590,11 +590,16 @@ class Controller(BaseController):
The EventType enumeration is mapped to event classes as follows...
- ========= =========== - EventType Event Class - ========= =========== - **BW** :class:`stem.response.events.BandwidthEvent` - ========= =========== + =========== =========== + EventType Event Class + =========== =========== + **DEBUG** :class:`stem.response.events.LogEvent` + **INFO** :class:`stem.response.events.LogEvent` + **NOTICE** :class:`stem.response.events.LogEvent` + **WARN** :class:`stem.response.events.LogEvent` + **ERR** :class:`stem.response.events.LogEvent` + **BW** :class:`stem.response.events.BandwidthEvent` + =========== ===========
:param functor listener: function to be called when an event is received :param stem.control.EventType events: event types to be listened for diff --git a/stem/response/events.py b/stem/response/events.py index fa451c7..93c3191 100644 --- a/stem/response/events.py +++ b/stem/response/events.py @@ -14,6 +14,11 @@ class Event(stem.response.ControlMessage): Base for events we receive asynchronously, as described in section 4.1 of the `control-spec https://gitweb.torproject.org/torspec.git/blob/HEAD:/control-spec.txt`_. + + :var str type: event type + :var int arrived_at: unix timestamp for when the message arrived + :var list positional_args: positional arguments of the event + :var dict keyword_args: key/value arguments of the event """
_POSITIONAL_ARGS = () @@ -91,7 +96,29 @@ class BandwidthEvent(Event): self.read = long(self.read) self.written = long(self.written)
+class LogEvent(Event): + """ + Tor logging event. These are the most visible kind of event since, by + default, tor logs at the NOTICE runlevel to stdout. + + :var str runlevel: runlevel of the logged message + :var str message: logged message + """ + + def _parse(self): + self.runlevel = self.type + + # message is our content, minus the runlevel and ending "OK" if a + # multi-line message + + self.message = str(self)[len(self.runlevel) + 1:].rstrip("\nOK") + EVENT_TYPE_TO_CLASS = { "BW": BandwidthEvent, + "DEBUG": LogEvent, + "INFO": LogEvent, + "NOTICE": LogEvent, + "WARN": LogEvent, + "ERR": LogEvent, }
diff --git a/test/unit/response/events.py b/test/unit/response/events.py index 1dea7c7..1942b69 100644 --- a/test/unit/response/events.py +++ b/test/unit/response/events.py @@ -72,4 +72,23 @@ class TestEvents(unittest.TestCase): self.assertRaises(ProtocolError, _get_event, "650 BW -15 25") self.assertRaises(ProtocolError, _get_event, "650 BW 15 -25") self.assertRaises(ProtocolError, _get_event, "650 BW x 25") + + def test_log_events(self): + event = _get_event("650 DEBUG connection_edge_process_relay_cell(): Got an extended cell! Yay.") + + self.assertTrue(isinstance(event, stem.response.events.LogEvent)) + self.assertEqual("DEBUG", event.runlevel) + self.assertEqual("connection_edge_process_relay_cell(): Got an extended cell! Yay.", event.message) + + event = _get_event("650 INFO circuit_finish_handshake(): Finished building circuit hop:") + + self.assertTrue(isinstance(event, stem.response.events.LogEvent)) + self.assertEqual("INFO", event.runlevel) + self.assertEqual("circuit_finish_handshake(): Finished building circuit hop:", event.message) + + event = _get_event("650+WARN\na multi-line\nwarning message\n.\n650 OK\n") + + self.assertTrue(isinstance(event, stem.response.events.LogEvent)) + self.assertEqual("WARN", event.runlevel) + self.assertEqual("a multi-line\nwarning message", event.message)
tor-commits@lists.torproject.org