Ticket #727: 727_logfile.diff

File 727_logfile.diff, 3.8 KB (added by therve, 8 years ago)
  • twisted/python/logfile.py

     
    99""" 
    1010 
    1111# System Imports 
    12 import os, glob, string, time 
     12import os, glob, string, time, gzip 
    1313 
    1414# sibling imports 
    1515 
     
    151151 
    152152threadable.synchronize(LogFile) 
    153153 
     154class GzipLogFile(LogFile): 
     155    def rotate(self): 
     156        if not (os.access(self.directory, os.W_OK) and os.access(self.path, os.W_OK)): 
     157            return 
     158        logs = self.listLogs() 
     159        logs.reverse() 
     160        for i in logs: 
     161            os.rename("%s.%d.gz" % (self.path, i), "%s.%d.gz" % (self.path, i + 1)) 
     162        self._file.close() 
    154163 
     164        newpath = "%s.1" % self.path 
     165        os.rename(self.path, newpath) 
     166        gz = gzip.open("%s.gz" % newpath, "wb") 
     167        newfp = open(newpath) 
     168        for l in newfp: 
     169            gz.write(l) 
     170        gz.close() 
     171        newfp.close() 
     172        os.remove(newpath) 
     173 
     174        self._openFile() 
     175 
     176    def listLogs(self): 
     177        """Return sorted list of integers - the old logs' identifiers.""" 
     178        result = [] 
     179        for name in glob.glob("%s.*" % self.path): 
     180            try: 
     181                counter = int(string.split(name, '.')[-2]) 
     182                if counter: 
     183                    result.append(counter) 
     184            except ValueError: 
     185                pass 
     186        result.sort() 
     187        return result 
     188 
    155189class DailyLogFile(BaseLogFile): 
    156190    """A log file that is rotated daily (at or after midnight localtime) 
    157191    """ 
  • twisted/test/test_logfile.py

     
    66from twisted.trial import unittest 
    77 
    88# system imports 
    9 import os, shutil, time 
     9import os, shutil, time, gzip 
    1010 
    1111# twisted imports 
    1212from twisted.python import logfile 
     
    2323     
    2424    def tearDown(self): 
    2525        shutil.rmtree(self.dir) 
    26         pass 
    2726     
    2827    def testWriting(self): 
    2928        log = logfile.LogFile(self.name, self.dir) 
     
    158157        # reset permission so tearDown won't fail 
    159158        os.chmod(self.dir, 0777) 
    160159 
     160class GzipLogFileTestCase(unittest.TestCase): 
     161    """Test the compressed rotating log file.""" 
     162 
     163    def setUp(self): 
     164        self.dir = self.mktemp() 
     165        os.makedirs(self.dir) 
     166        self.name = "test.log" 
     167        self.path = os.path.join(self.dir, self.name) 
     168     
     169    def tearDown(self): 
     170        #shutil.rmtree(self.dir) 
     171        pass 
     172 
     173    def testRotation(self): 
     174        # this logfile should rotate every 10 bytes 
     175        log = logfile.GzipLogFile(self.name, self.dir, rotateLength=10) 
    161176         
     177        # test automatic rotation 
     178        log.write("123") 
     179        log.write("4567890") 
     180        log.write("1" * 11) 
     181        self.assert_(os.path.exists("%s.1.gz" % self.path)) 
     182        g = gzip.open("%s.1.gz" % self.path) 
     183        self.assertEquals(g.read(), "1234567890") 
     184        g.close() 
     185        self.assert_(not os.path.exists("%s.2.gz" % self.path)) 
     186        log.write('') 
     187        self.assert_(os.path.exists("%s.1.gz" % self.path)) 
     188        self.assert_(os.path.exists("%s.2.gz" % self.path)) 
     189        g = gzip.open("%s.1.gz" % self.path) 
     190        self.assertEquals(g.read(), "1" * 11) 
     191        g.close() 
     192        self.assert_(not os.path.exists("%s.3.gz" % self.path)) 
     193        log.write("3") 
     194        self.assert_(not os.path.exists("%s.3.gz" % self.path)) 
     195         
     196        # test manual rotation 
     197        log.rotate() 
     198        self.assert_(os.path.exists("%s.3.gz" % self.path)) 
     199        self.assert_(not os.path.exists("%s.4.gz" % self.path)) 
     200        log.close() 
     201 
     202        self.assertEquals(log.listLogs(), [1, 2, 3]) 
     203     
     204  
    162205class RiggedDailyLogFile(logfile.DailyLogFile): 
    163206    _clock = 0.0 
    164207