--- 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 = {}