Skip to content

Commit

Permalink
Implementation + additional test
Browse files Browse the repository at this point in the history
 * descriptor to for management of class variable

 * additional test to confirm proper behavior on reopen
  • Loading branch information
Whit Morriss committed Dec 16, 2011
1 parent aabd376 commit d2bc685
Show file tree
Hide file tree
Showing 2 changed files with 38 additions and 10 deletions.
34 changes: 31 additions & 3 deletions supervisor/loggers.py
Expand Up @@ -44,7 +44,7 @@ def getLevelNumByDescription(description):
num = getattr(LevelsByDescription, description, None)
return num

class Handler:
class Handler(object):
fmt = '%(message)s'
level = LevelsByName.INFO
def setFormat(self, fmt):
Expand Down Expand Up @@ -87,7 +87,6 @@ def handleError(self, record):
class FileHandler(Handler):
"""File handler which supports reopening of logs.
"""

def __init__(self, filename, mode="a"):
self.stream = open(filename, mode)
self.baseFilename = filename
Expand Down Expand Up @@ -139,6 +138,9 @@ def clear(self):
self.buf = ''

class RotatingFileHandler(FileHandler):

open_streams = {}

def __init__(self, filename, mode='a', maxBytes=512*1024*1024,
backupCount=10):
"""
Expand All @@ -163,12 +165,38 @@ def __init__(self, filename, mode='a', maxBytes=512*1024*1024,
"""
if maxBytes > 0:
mode = 'a' # doesn't make sense otherwise!
FileHandler.__init__(self, filename, mode)
self.mode = mode
self.baseFilename = filename
self.stream = self.stream or open(filename, mode)

self.maxBytes = maxBytes
self.backupCount = backupCount
self.counter = 0
self.every = 10

class _stream(object):
"""
Descriptor for managing open filehandles so that only one
filehandle per file path ever receives logging.
"""
def __get__(self, obj, objtype):
"""
Return open filehandle or None
"""
return objtype.open_streams.get(obj.baseFilename)

def __set__(self, obj, stream):
"""
Set open filehandle for filename defined on the
RotatingFileHandler
"""
obj.open_streams[obj.baseFilename] = stream

stream = _stream()

def close(self):
if self.stream: self.stream.close()

def emit(self, record):
"""
Emit a record.
Expand Down
14 changes: 7 additions & 7 deletions supervisor/tests/test_loggers.py
Expand Up @@ -162,13 +162,13 @@ def test_emit_tracks_correct_file_for_multiple_handlers(self):
handler2.emit(new_record)
self.assertTrue(open(self.filename).read().endswith(""))

## def test_reopen_raises(self):
## handler = self._makeOne(self.filename)
## stream = DummyStream()
## handler.baseFilename = os.path.join(self.basedir, 'notthere', 'a.log')
## handler.open_streams[handler.baseFilename] = stream
## self.assertRaises(IOError, handler.reopen)
## self.assertEqual(stream.closed, True)
def test_reopen_raises(self):
handler = self._makeOne(self.filename)
stream = DummyStream()
handler.baseFilename = os.path.join(self.basedir, 'notthere', 'a.log')
handler.open_streams[handler.baseFilename] = stream
self.assertRaises(IOError, handler.reopen)
self.assertEqual(stream.closed, True)

def test_emit_does_rollover(self):
handler = self._makeOne(self.filename, maxBytes=10, backupCount=2)
Expand Down

0 comments on commit d2bc685

Please sign in to comment.