85 parser = argparse.ArgumentParser(description=__doc__, formatter_class=
86 lambda prog : argparse.HelpFormatter(
87 prog, max_help_position=40, width=100))
89 parser.add_argument(
'logfile', metavar=
'<logfile>', nargs=
'+',
90 help=
'log file(s) to scan')
91 parser.add_argument(
'--config', metavar=
'<file>',
92 help=
'specify config file')
93 parser.add_argument(
'--showexcludestats', action=
'store_true',
94 help=
'print summary table with number of matches for each exclude pattern')
95 parser.add_argument(
'--printpatterns', action=
'store_true',
96 help=
'print the list of warning/error patterns being searched for')
97 parser.add_argument(
'--warnings', action =
'store_true',
98 help=
'check for WARNING messages')
99 parser.add_argument(
'--errors', action =
'store_true',
100 help=
'check for ERROR messages')
139 """Scan one log file and print report"""
140 tPattern = re.compile(
'|'.join(backtrace))
141 fpeStartPattern = re.compile(
'|'.join(fpeTracebackStart))
142 fpeContPattern = re.compile(
'|'.join(fpeTracebackCont))
146 if args.warnings
is True:
147 categories += [
'warning']
148 if args.errors
is True:
149 categories += [
'error/fatal',
'prohibited',
'python error',
'fpe',
'backtrace']
152 if not ignorePattern:
153 ignorePattern.append(
'(?!)')
155 igLevels = re.compile(
'|'.join(ignorePattern))
158 cat: re.compile(
'|'.join(regexMap[cat]))
for cat
in categories
160 resultsA = {cat:[]
for cat
in categories}
161 with open(logfile, encoding=
'utf-8')
as f:
170 if tPattern.search(line)
and not igLevels.search(line):
172 elif fpeStartPattern.search(line)
and not igLevels.search(line):
180 resultsA[
'backtrace'].append(line)
183 if fpeStartPattern.search(line)
or fpeContPattern.search(line):
184 resultsA[
'fpe'].append(line)
188 for cat
in categories:
189 if patterns[cat].
search(line):
190 resultsA[cat].append(line)
191 except UnicodeDecodeError
as e:
192 print(f
'ERROR: Exception raised processing log file: {e}\n')
195 results = {cat:[]
for cat
in categories}
196 if args.config
is None:
199 if args.showexcludestats:
200 separateIgnoreRegex = [re.compile(line)
for line
in ignorePattern]
201 ignoreDict = {line:0
for line
in ignorePattern}
204 for cat, messages
in resultsA.items():
206 if not igLevels.search(res):
207 results[cat].append(res)
208 elif args.showexcludestats:
209 for i
in range(len(separateIgnoreRegex)):
210 if separateIgnoreRegex[i].
search(res):
211 ignoreDict[ignorePattern[i]] += 1
215 found_bad_message =
False
216 for cat
in categories:
218 if args.printpatterns:
219 print(f
'check_log.py - Checking for {cat} messages with pattern: {str(patterns[cat])} in '+logfile+
'\n')
220 if len(results[cat]) > 0:
221 print(f
'Found {len(results[cat])} {cat} message(s) in {logfile}:')
222 for msg
in results[cat]:
print(msg.strip(
'\n'))
223 found_bad_message =
True
228 if ignoreDict[s] > 0:
229 print(str(ignoreDict[s]) +
"x " + s)
232 if found_bad_message:
233 print(f
'FAILURE : problematic message found in {logfile}')
236 print(f
'No error/warning messages found in {logfile}')
void search(TDirectory *td, const std::string &s, std::string cwd, node *n)
recursive directory search for TH1 and TH2 and TProfiles