]> git.ipfire.org Git - thirdparty/tornado.git/commitdiff
Move request logging from RequestHandler to Application.
authorBen Darnell <ben@bendarnell.com>
Fri, 21 Jan 2011 21:14:06 +0000 (13:14 -0800)
committerBen Darnell <ben@bendarnell.com>
Fri, 21 Jan 2011 21:14:06 +0000 (13:14 -0800)
Logging can now be configured with either a subclass or setting of
Application.  This replaces the previous method of overriding a private
method of RequestHandler, which was difficult to do for built-in handlers
(StaticFileHandler and RedirectHandler).

tornado/web.py

index e6f2d381a1ff0f69c435c44c6c47f7b4e084751b..f5046a25dccd1787fe60d39ad828ea43c4d477b2 100644 (file)
@@ -189,6 +189,10 @@ class RequestHandler(object):
         assert status_code in httplib.responses
         self._status_code = status_code
 
+    def get_status(self):
+        """Returns the status code for our response."""
+        return self._status_code
+
     def set_header(self, name, value):
         """Sets the given response header name and value.
 
@@ -857,15 +861,13 @@ class RequestHandler(object):
         return "\r\n".join(lines) + "\r\n\r\n"
 
     def _log(self):
-        if self._status_code < 400:
-            log_method = logging.info
-        elif self._status_code < 500:
-            log_method = logging.warning
-        else:
-            log_method = logging.error
-        request_time = 1000.0 * self.request.request_time()
-        log_method("%d %s %.2fms", self._status_code,
-                   self._request_summary(), request_time)
+        """Logs the current request.
+
+        Sort of deprecated since this functionality was moved to the
+        Application, but left in place for the benefit of existing apps
+        that have overridden this method.
+        """
+        self.application.log_request(self)
 
     def _request_summary(self):
         return self.request.method + " " + self.request.uri + " (" + \
@@ -1198,6 +1200,28 @@ class Application(object):
             return self.named_handlers[name].reverse(*args)
         raise KeyError("%s not found in named urls" % name)
 
+    def log_request(self, handler):
+        """Writes a completed HTTP request to the logs.
+
+        By default writes to the python root logger.  To change
+        this behavior either subclass Application and override this method,
+        or pass a function in the application settings dictionary as
+        'log_function'.
+        """
+        if "log_function" in self.settings:
+            self.settings["log_function"](handler)
+            return
+        if handler.get_status() < 400:
+            log_method = logging.info
+        elif handler.get_status() < 500:
+            log_method = logging.warning
+        else:
+            log_method = logging.error
+        request_time = 1000.0 * handler.request.request_time()
+        log_method("%d %s %.2fms", handler.get_status(),
+                   handler._request_summary(), request_time)
+
+
 
 class HTTPError(Exception):
     """An exception that will turn into an HTTP error response."""