286 def scanLogFile(self, resetReport=False):
287 nonStandardErrorsList = self.knowledgeFileHandler(
'nonStandardErrors.db')
292 for log
in self._logfile:
293 msg.debug(
'Now scanning logfile {0}'.
format(log))
294 seenNonStandardError =
''
297 myGen = trfUtils.lineByLine(log, substepName=self._substepName)
299 msg.error(
'Failed to open transform logfile {0}: {1:s}'.
format(log, e))
301 self._levelCounter[
'ERROR'] = 1
302 self._errorDetails[
'ERROR'] = {
'message':
str(e),
'firstLine': 0,
'count': 1}
304 for line, lineCounter
in myGen:
305 m = self._metaPat.
search(line)
307 key, value = m.groups()
308 self._metaData[key] = value
310 m = self._regExp.
match(line)
314 if 'Core dump from CoreDumpSvc' in line:
315 msg.warning(
'Detected CoreDumpSvc report - activating core dump svc grabber')
316 self.coreDumpSvcParser(log, myGen, line, lineCounter)
319 if 'G4Exception-START' in line:
320 msg.warning(
'Detected G4 exception report - activating G4 exception grabber')
321 self.g4ExceptionParser(myGen, line, lineCounter, 40)
323 if '*** G4Exception' in line:
324 msg.warning(
'Detected G4 9.4 exception report - activating G4 exception grabber')
325 self.g494ExceptionParser(myGen, line, lineCounter)
328 if 'Shortened traceback (most recent user call last)' in line:
329 msg.warning(
'Detected python exception - activating python exception grabber')
330 self.pythonExceptionParser(log, myGen, line, lineCounter)
333 if 'terminate called after throwing an instance of \'std::bad_alloc\'' in line:
334 msg.warning(
'Detected bad_alloc!')
335 self.badAllocExceptionParser(myGen, line, lineCounter)
339 if 'Error in <TFile::ReadBuffer>' in line:
340 self.rootSysErrorParser(myGen, line, lineCounter)
343 if 'Error in <TFile::WriteBuffer>' in line:
344 self.rootSysErrorParser(myGen, line, lineCounter)
347 if any(line
in l
for l
in nonStandardErrorsList):
348 seenNonStandardError = line
351 msg.debug(
'Non-standard line in %s: %s', log, line)
352 self._levelCounter[
'UNKNOWN'] += 1
357 for matchKey
in (
'service',
'level',
'message'):
358 fields[matchKey] = m.group(matchKey)
359 msg.debug(
'Line parsed as: {0}'.
format(fields))
363 for ignorePat
in self._ignoreList.structuredPatterns:
364 serviceMatch = ignorePat[
'service'].
match(fields[
'service'])
365 levelMatch = (ignorePat[
'level'] ==
"" or ignorePat[
'level'] == fields[
'level'])
366 messageMatch = ignorePat[
'message'].
match(fields[
'message'])
367 if serviceMatch
and levelMatch
and messageMatch:
368 msg.info(
'Error message "{0}" was ignored at line {1} (structured match)'.
format(line, lineCounter))
371 if ignoreFlag
is False:
372 for searchPat
in self._ignoreList.searchPatterns:
373 if searchPat.search(line):
374 msg.info(
'Error message "{0}" was ignored at line {1} (search match)'.
format(line, lineCounter))
379 fields[
'level'] =
'IGNORED'
385 if 'std::bad_alloc' in fields[
'message']:
386 fields[
'level'] =
'CATASTROPHE'
389 if fields[
'level'] ==
'FATAL':
390 if seenNonStandardError:
391 line +=
'; ' + seenNonStandardError
394 self._levelCounter[fields[
'level']] += 1
398 if fields[
'level'] ==
'IGNORED' or stdLogLevels[fields[
'level']] >= self._msgDetails:
399 if self._levelCounter[fields[
'level']] <= self._msgLimit:
400 detailsHandled =
False
401 for seenError
in self._errorDetails[fields[
'level']]:
402 if seenError[
'message'] == line:
403 seenError[
'count'] += 1
404 detailsHandled =
True
406 if detailsHandled
is False:
407 self._errorDetails[fields[
'level']].
append({
'message': line,
'firstLine': lineCounter,
'count': 1})
408 elif self._levelCounter[fields[
'level']] == self._msgLimit + 1:
409 msg.warning(
"Found message number {0} at level {1} - this and further messages will be supressed from the report".
format(self._levelCounter[fields[
'level']], fields[
'level']))
413 if 'Total payload read from COOL' in fields[
'message']:
414 msg.debug(
"Found COOL payload information at line {0}".
format(line))
415 a = re.match(
r'(\D+)(?P<bytes>\d+)(\D+)(?P<time>\d+[.]?\d*)(\D+)', fields[
'message'])
416 self._dbbytes +=
int(a.group(
'bytes'))
417 self._dbtime +=
float(a.group(
'time'))