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

source_changes at macosforge.org source_changes at macosforge.org
Wed Mar 12 11:17:19 PDT 2014


Revision: 12635
          http://trac.calendarserver.org//changeset/12635
Author:   wsanchez at apple.com
Date:     2014-02-10 13:18:16 -0800 (Mon, 10 Feb 2014)
Log Message:
-----------
Try to stream, and fail

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

Modified: CalendarServer/trunk/calendarserver/webadmin/logs.py
===================================================================
--- CalendarServer/trunk/calendarserver/webadmin/logs.py	2014-02-10 19:57:08 UTC (rev 12634)
+++ CalendarServer/trunk/calendarserver/webadmin/logs.py	2014-02-10 21:18:16 UTC (rev 12635)
@@ -24,6 +24,8 @@
     "LogEventsResource",
 ]
 
+from collections import deque
+
 from zope.interface import implementer
 
 from twisted.internet.defer import succeed
@@ -33,6 +35,8 @@
 from txweb2.http_headers import MimeType
 from txweb2.http import Response
 
+from calendarserver.accesslog import CommonAccessLoggingObserverExtensions
+
 from .resource import PageElement, TemplateResource
 
 
@@ -79,10 +83,12 @@
     def __init__(self):
         Resource.__init__(self)
 
+        self._observer = AccessLoggingObserver()
 
+
     def render(self, request):
         response = Response()
-        response.stream = LogObservingEventStream()
+        response.stream = LogObservingEventStream(self._observer)
         response.headers.setHeader(
             "content-type", MimeType.fromString("text/event-stream")
         )
@@ -100,7 +106,11 @@
     length = None
 
 
-    def __init__(self):
+    def __init__(self, observer, start=None):
+        object.__init__(self)
+
+        self._observer = observer
+        self._start = start
         self._closed = False
 
 
@@ -108,9 +118,36 @@
         if self._closed:
             return None
 
-        return succeed(textAsEvent(u"Hello!"))
+        start = self._start
 
+        events = []
 
+        for message in self._observer.messages():
+            # If we have a start point, skip messages up to and including the
+            # one at the start point.
+            if start is not None:
+                if id(message) == start:
+                    start = None
+                continue
+
+            events.append(textAsEvent(message))
+
+        if events:
+            # Remember the ID of the last event read at our start point
+            self._start = id(events[-1])
+
+            return succeed("".join(events))
+
+        if self._start is not None:
+            # We have a start point and no data... maybe if fell off of the
+            # buffer; remove the start point and try again.
+            self._start = None
+            return self.read()
+
+        # No start point and no events == EOF
+        return succeed(None)
+
+
     def split(self, point):
         return fallbackSplit(self, point)
 
@@ -120,5 +157,30 @@
 
 
 
+class AccessLoggingObserver(CommonAccessLoggingObserverExtensions):
+    """
+    Log observer that captures apache-style access log text entries in a
+    buffer.
+    """
+    def __init__(self):
+        CommonAccessLoggingObserverExtensions.__init__(self)
+
+        self._buffer = deque(maxlen=400)
+
+
+    def logMessage(self, message):
+        self._buffer.append(message)
+
+
+    def messages(self):
+        return iter(self._buffer)
+
+
+
 def textAsEvent(text):
-    return u"data: {text}\n\n".format(text=text).encode("utf-8")
+    return (
+        u"id: {id}\n"
+        u"data: {text}\n"
+        u"\n"
+        .format(id=id(text), text=text).encode("utf-8")
+    )
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20140312/83780ae5/attachment.html>


More information about the calendarserver-changes mailing list