Changeset 155
- Timestamp:
- Tue Nov 29 14:10:16 2005
- Files:
Legend:
- Unmodified
- Added
- Removed
- Modified
-
subprojects/LogGrok/trunk/loggrok/parse.py
r151 r155 11 11 __revision__ = '$Revision$' 12 12 13 LOG_PATTERN_DEFAULT = re.compile(r'^(\d\d\d\d-\d\d-\d\d \d\d:\d\d:\d\d,\d\d\d) ([A-Z]{4,5}) ') 13 LOG_PATTERN_DEFAULT = re.compile(r'^(\d\d\d\d-\d\d-\d\d \d\d:\d\d:\d\d,\d\d\d) ([A-Z]{4,5}) *') 13 13 14 14 -
subprojects/LogGrok/trunk/loggrok/actions.py
r151 r155 7 7 import sys 8 8 9 from xix.utils.python import CurriedCallable 10 9 11 __author__ = 'Drew Smathers' 10 12 __copyright__ = 'Copyright 2005, Drew Smathers' … … 18 20 self.__category_callbacks = {} 19 21 20 def addLevelCallback(self, level, func): 22 def addLevelCallback(self, level, func, *pargs, **kwargs): 20 22 """Add callback for entry with level given in 21 23 log entry header. … … 25 27 if level not in lcs.keys(): 26 28 lcs[level] = [] 27 lcs[level].append( func)29 lcs[level].append(CurriedCallable(func, *pargs, **kwargs)) 27 29 28 def addMessageCategoryCallback(self, cat, func): 30 def addMessageCategoryCallback(self, cat, func, *pargs, **kwargs): 28 30 """Add callback for entry of the given category. 29 31 """ … … 33 35 if cat not in mcs.keys(): 34 36 mcs[cat] = [] 35 mcs[cat].append( func)37 mcs[cat].append(CurriedCallable(func, *pargs, **kwargs)) 35 37 36 38 def __call__(self, entry): -
subprojects/LogGrok/trunk/loggrok/log.py
r151 r155 7 7 from loggrok.parse import parserFactory, LogParseException 8 8 9 from xix.utils.io import AggregateFile 9 from xix.utils.io import AggregateFile, AggregateFileInput 9 9 from UserString import UserString 10 10 from cStringIO import StringIO … … 91 91 else: 92 92 self.fd = open(logfile) 93 self.fd = logfile 93 94 self.messageParser = parserFactory('log.message') 94 95 self.headerParser = parserFactory('log.header') 95 96 self.__lastheader = None 96 self.action = None 97 self.action = self.__donothing 98 # some state information for handling lines 99 self.header = None 100 self.message_buffer = StringIO() 97 101 102 def __donothing(self, entry): 103 pass 104 105 def __recvline(self, line): 106 try: 107 header, _ = self.headerParser.parse(line) 108 if header: 109 try: 110 entry = None 111 if self.header: 112 entry = self.__process_entry() 113 self.header = LogHeader(header) 114 self.message_buffer.write(line[len(self.header):]) 115 return entry 116 except LogParseException, lpe: 117 self.header = LogHeader(header) 118 self.message_buffer.truncate(0) 119 self.message_buffer.seek(0) 120 self.message_buffer.write(line[len(self.header):]) 121 return 122 else: 123 self.message_buffer.write(line) 124 except: 125 self.message_buffer.write(line) 126 127 def __process_entry(self): 128 message = self.message_buffer.getvalue() 129 entry = LogEntry(self.header, message, parser=self.messageParser) 130 self.action(entry) 131 self.message_buffer.truncate(0) 132 self.message_buffer.seek(0) 133 return entry 134 98 135 def readentry(self): 99 """Read the next entry in this log. 136 """Read the next entry in this log. Do not use this 99 136 100 137 @todo unit testing … … 148 185 @todo unit testing 149 186 """ 150 entry = self.readentry() 151 while entry: 152 yield entry 153 entry = self.readentry() 187 #entry = self.readentry() 188 #while entry: 189 # yield entry 190 # entry = self.readentry() 191 for line in self.fd: 192 entry = self.__recvline(line) 193 if entry: 194 yield entry 195 try: 196 entry = self.__process_entry() 197 if entry: 198 yield entry 199 except LogParseException: 200 pass 154 201 155 202 def __iter__(self): … … 169 216 together a sequence of logs into one log object. 170 217 """ 218 219 def __init__(self, files): 220 LogStream.__init__(self, AggregateFileInput(files)) 221 222 223 def _sortmatched(matched, pos): 224 sortlist = [] 225 default = None 226 for match in matched: 227 try: 228 index = int(match.split('.')[pos]) 229 sortlist.append((index, match)) 230 except Exception, e: 231 default = match 232 sortlist.sort() 233 results = [tup[1] for tup in sortlist] 234 if default: 235 results = [default] + results 236 results.reverse() 237 return results 171 238 172 239 class RollingIndexLogStream(RollingLogStream): … … 184 251 """ 185 252 matched = glob.glob(os.path.join(directory, basename + '*.' + ext)) 186 matched.sort() 187 matched.reverse() 188 matched = matched[1:] + matched[0:1] 189 RollingLogStream.__init__(self, AggregateFile(matched).open()) 253 matched = _sortmatched(matched, -2) 254 RollingLogStream.__init__(self, matched) 190 255 256 class RollingIndexLogStream2(RollingLogStream): 257 """For directories containing logs of the form (from newest to oldest): 258 259 <basename>.log <basename>.log.1 <basename>.log.2 260 """ 191 261 262 def __init__(self, directory, basename, ext="log"): 263 matched = glob.glob(os.path.join(directory, basename + "." + ext + "*")) 264 matched = _sortmatched(matched, -1) 265 RollingLogStream.__init__(self, matched) 266 192 267 class RollingDateLogStream(RollingLogStream): 193 268
