Changeset 9:aa758a4112ce in livinglogic.python.tipimaid

Show
Ignore:
Timestamp:
11/19/08 15:16:46 (10 years ago)
Author:
Nikolas Tautenhahn <nik@…>
Branch:
default
Message:

tidy up, add run method, fix gzip-filenames in init

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • liaalh.py

    r8 r9  
    77 
    88class Buffer(object): 
    9     def __init__(self, pattern='', gzip_logs=None, buffertime=5): 
     9    def __init__(self, pattern='', gzip_logs=None, buffertime=5, stream=sys.stdin): 
    1010        self.pattern = pattern 
    1111        self.gzip_logs = gzip_logs 
     
    1313        self.servers = {} 
    1414        self.buffertime = datetime.timedelta(seconds=buffertime) 
     15        self.stream = stream 
     16        self.re_find_date = re.compile(" \[(.*?)\] ") 
     17        if gzip_logs is not None and not pattern.endswith(".gz"): 
     18            self.pattern = "%s.gz" % self.pattern 
    1519 
    16     def sorted_insert(self, logline): 
     20    def add(self, logline): 
    1721        if not self.data or logline > self.data[-1]: 
    1822            self.data.append(logline) 
     
    3438            filename = datetime.datetime.now().strftime(self.pattern) 
    3539            filename = filename.replace("%v", server) 
    36             if self.gzip_logs is not None and not filename.endswith(".gz"): 
    37                 filename = "%s.gz" % filename 
    3840            if server in self.servers: 
    3941                f = self.servers[server] 
    4042                if f.name != filename: 
    4143                    f.close() 
    42                     f = self.openfile(filename) 
    43                     if self.gzip_logs is not None: 
    44                         f = gzip.GzipFile(fileobj=f, compresslevel=self.gzip_logs) 
    45                         f.name = f.fileobj.name # gzip-fileobjects don't have a name attribute 
    46                     self.servers[server] = f 
     44                    self.servers[server] = self.openfile(filename) 
    4745            else: 
    4846                f = self.openfile(filename) 
    49                 if self.gzip_logs is not None: 
    50                     f = gzip.GzipFile(fileobj=f, compresslevel=self.gzip_logs) 
    51                     f.name = f.fileobj.name 
    5247                self.servers[server] = f 
    5348            f.write(logdata) 
     
    5954    def openfile(self, filename): 
    6055        try: 
    61             return open(filename, "a", 1) 
     56            f = open(filename, "a", 1) 
    6257        except IOError, exc: 
    6358            if exc.errno == errno.ENOENT: 
    6459                os.makedirs(os.path.dirname(filename)) 
    65                 return open(filename, "a", 1) 
     60                f = open(filename, "a", 1) 
    6661            else: 
    6762                raise 
     63        if self.gzip_logs is not None: 
     64            f = gzip.GzipFile(fileobj=f, compresslevel=self.gzip_logs) 
     65            f.name = f.fileobj.name # gzip-fileobjects don't have a name attribute 
     66        return f 
    6867 
     68    def apachedate2utc(self, d): 
     69        temp = d.split() 
     70        utcdate = datetime.datetime.strptime(temp[0], "%d/%b/%Y:%H:%M:%S") 
     71        minsoff = int("%s%s" % (temp[1][0], temp[1][-2:])) 
     72        hrsoff = int("%s%s" % (temp[1][0], temp[1][1:3])) 
     73        utcdate -= datetime.timedelta(hours=hrsoff, minutes=minsoff) 
     74        return utcdate 
    6975 
    70 def apachedate2utc(d): 
    71     temp = d.split() 
    72     utcdate = datetime.datetime.strptime(temp[0], "%d/%b/%Y:%H:%M:%S") 
    73     minsoff = int("%s%s" % (temp[1][0], temp[1][-2:])) 
    74     hrsoff = int("%s%s" % (temp[1][0], temp[1][1:3])) 
    75     utcdate -= datetime.timedelta(hours=hrsoff, minutes=minsoff) 
    76     return utcdate 
    77  
    78  
    79 def run(stream, pattern, gzip_logs=None): 
    80     buf = Buffer(pattern=pattern, gzip_logs=gzip_logs) 
    81     re_find_date = re.compile(" \[(.*?)\] ") 
    82     while True: 
    83         line = stream.readline() 
    84         datestring = re_find_date.findall(line)[0] 
    85         utctime = apachedate2utc(datestring) 
    86         (server, data) = line.split(None, 1) 
    87         buf.sorted_insert((utctime, server, data)) 
     76    def run(self): 
     77        while True: 
     78            line = self.stream.readline() 
     79            datestring = self.re_find_date.findall(line)[0] 
     80            utctime = self.apachedate2utc(datestring) 
     81            (server, data) = line.split(None, 1) 
     82            self.add((utctime, server, data)) 
    8883 
    8984 
     
    10398        sys.stderr.flush() 
    10499        return 1 
    105     run(sys.stdin, args[0], options.gzip) 
     100    buf = Buffer(pattern=args[0], gzip_logs=options.gzip) 
     101    buf.run() 
    106102 
    107103