--- a/Allura/allura/lib/utils.py
+++ b/Allura/allura/lib/utils.py
@@ -2,11 +2,13 @@
 import string
 import hashlib
 import binascii
-import logging
+import logging.handlers
+import codecs
+import os.path
+import datetime
 import random
 import mimetypes
 from itertools import groupby
-from logging.handlers import WatchedFileHandler
 
 import tg
 import pylons
@@ -102,7 +104,29 @@
         if name.startswith('_'): raise AttributeError, name
         return getattr(self._logger, name)
 
-class StatsHandler(WatchedFileHandler):
+class TimedRotatingHandler(logging.handlers.BaseRotatingHandler):
+
+    def __init__(self, strftime_pattern):
+        self.pattern = strftime_pattern
+        self.last_filename = self.current_filename()
+        logging.handlers.BaseRotatingHandler.__init__(self, self.last_filename, 'a')
+
+    def current_filename(self):
+        return os.path.abspath(datetime.datetime.utcnow().strftime(self.pattern))
+
+    def shouldRollover(self, record):
+        'Inherited from BaseRotatingFileHandler'
+        return self.current_filename() != self.last_filename
+
+    def doRollover(self):
+        self.stream.close()
+        self.baseFilename = self.current_filename()
+        if self.encoding:
+            self.stream = codecs.open(self.baseFilename, 'w', self.encoding)
+        else:
+            self.stream = open(self.baseFilename, 'w')
+
+class StatsHandler(TimedRotatingHandler):
     fields=('action', 'action_type', 'tool_type', 'tool_mount', 'project', 'neighborhood',
             'username', 'url', 'ip_address')
 
@@ -113,7 +137,7 @@
                  **kwargs):
         self.page = page
         self.module = module
-        WatchedFileHandler.__init__(self, strftime_pattern)
+        TimedRotatingHandler.__init__(self, strftime_pattern)
 
     def emit(self, record):
         if not hasattr(record, 'action'):
@@ -128,7 +152,7 @@
             '%s=%s' % (k,v) for k,v in sorted(kwpairs.iteritems())
             if v is not None)
         record.exc_info = None # Never put tracebacks in the rtstats log
-        WatchedFileHandler.emit(self, record)
+        TimedRotatingHandler.emit(self, record)
 
 def chunked_find(cls, query=None, pagesize=1024):
     if query is None: query = {}