[CalendarServer-changes] [12653] CalendarServer/trunk/calendarserver/webadmin/logs.py

source_changes at macosforge.org source_changes at macosforge.org
Wed Mar 12 11:20:47 PDT 2014


Revision: 12653
          http://trac.calendarserver.org//changeset/12653
Author:   wsanchez at apple.com
Date:     2014-02-11 12:16:08 -0800 (Tue, 11 Feb 2014)
Log Message:
-----------
Add main log observer

Modified Paths:
--------------
    CalendarServer/trunk/calendarserver/webadmin/logs.py

Modified: CalendarServer/trunk/calendarserver/webadmin/logs.py
===================================================================
--- CalendarServer/trunk/calendarserver/webadmin/logs.py	2014-02-11 19:03:36 UTC (rev 12652)
+++ CalendarServer/trunk/calendarserver/webadmin/logs.py	2014-02-11 20:16:08 UTC (rev 12653)
@@ -30,6 +30,7 @@
 
 from zope.interface import implementer
 
+from twisted.python.log import FileLogObserver
 from twisted.internet.defer import succeed
 
 from txweb2.stream import IByteStream, fallbackSplit
@@ -90,17 +91,20 @@
     def __init__(self):
         Resource.__init__(self)
 
-        logObserver = AccessLoggingObserver()
-        logObserver.start()
 
-        self._observer = logObserver
+    @property
+    def events(self):
+        if not hasattr(self, "_buffer"):
+            buffer = deque(maxlen=100)
 
-        # self._observer.logMessage(u"Hello")
-        # self._observer.logMessage(u"Yo")
-        # self._observer.logMessage(u"Bonjour")
-        # self._observer.logMessage(u"Hola")
+            AccessLogObserver(buffer).start()
+            BufferingLogObserver(buffer).start()
 
+            self._buffer = buffer
 
+        return self._buffer
+
+
     def render(self, request):
         start = request.headers.getRawHeaders("last-event-id")
 
@@ -111,7 +115,7 @@
                 start = None
 
         response = Response()
-        response.stream = LogObservingEventStream(self._observer, start)
+        response.stream = LogEventStream(self, start)
         response.headers.setHeader(
             "content-type", MimeType.fromString("text/event-stream")
         )
@@ -120,19 +124,18 @@
 
 
 @implementer(IByteStream)
-class LogObservingEventStream(object):
+class LogEventStream(object):
     """
-    L{IStream} that observes log events and streams them out as HTML5
-    EventSource events.
+    L{IByteStream} that streams log events out as HTML5 EventSource events.
     """
 
     length = None
 
 
-    def __init__(self, observer, start):
+    def __init__(self, source, start):
         object.__init__(self)
 
-        self._observer = observer
+        self._source = source
         self._start = start
         self._closed = False
 
@@ -144,7 +147,7 @@
         start = self._start
         messageID = None
 
-        for event in self._observer.events():
+        for eventClass, event in self._source.events:
             messageID = id(event)
 
             # If we have a start point, skip messages up to and including the
@@ -158,7 +161,10 @@
 
             self._start = messageID
 
-            message = event["log-format"] % event
+            if eventClass == "access":
+                message = event["log-format"] % event
+            else:
+                message = unicode(event)
 
             eventText = textAsEvent(
                 message, eventID=messageID, eventClass=u"access"
@@ -170,6 +176,7 @@
             # We just scanned all the messages, and none are the last one the
             # client saw.
             self._start = None
+            return succeed("-" * 80)
             return self.read()
 
         return succeed(None)
@@ -184,21 +191,41 @@
 
 
 
-# Note: CommonAccessLoggingObserverExtensions is an old-style log observer, as
-# it inherits from BaseCommonAccessLoggingObserver in txweb2.
+class BufferingLogObserver(FileLogObserver):
+    """
+    Log observer that captures events in a buffer instead of writing to a file.
 
-class AccessLoggingObserver(CommonAccessLoggingObserverExtensions):
+    @note: L{BufferingLogObserver} is an old-style log observer, as it
+        inherits from L{FileLogObserver}.
     """
+
+    def __init__(self, buffer):
+        class IO(object):
+            @staticmethod
+            def write(s):
+                buffer.append((u"server", s))
+
+            @staticmethod
+            def flush():
+                pass
+
+        FileLogObserver.__init__(self, IO)
+
+
+
+class AccessLogObserver(CommonAccessLoggingObserverExtensions):
+    """
     Log observer that captures apache-style access log text entries in a
     buffer.
 
-    @note: L{AccessLoggingObserver} is an old-style log observer, as it
+    @note: L{AccessLogObserver} is an old-style log observer, as it
         ultimately inherits from L{txweb2.log.BaseCommonAccessLoggingObserver}.
     """
-    def __init__(self):
+
+    def __init__(self, buffer):
         CommonAccessLoggingObserverExtensions.__init__(self)
 
-        self._buffer = deque(maxlen=100)
+        self._buffer = buffer
 
 
     def logStats(self, event):
@@ -206,18 +233,10 @@
         if event["type"] != "access-log":
             return
 
-        # # Omit events for the log event stream
-        # if event["uri"] == "/admin/logs/events":
-        #     return
+        self._buffer.append((u"access", event))
 
-        self._buffer.append(event)
 
 
-    def events(self):
-        return iter(self._buffer)
-
-
-
 def textAsEvent(text, eventID=None, eventClass=None):
     event = []
 
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20140312/8c135a38/attachment.html>


More information about the calendarserver-changes mailing list