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:
169 if tPattern.search(line)
and not igLevels.search(line):
171 elif fpeStartPattern.search(line)
and not igLevels.search(line):
179 resultsA[
'backtrace'].append(line)
182 if fpeStartPattern.search(line)
or fpeContPattern.search(line):
183 resultsA[
'fpe'].append(line)
187 for cat
in categories:
188 if patterns[cat].
search(line):
189 resultsA[cat].append(line)
192 results = {cat:[]
for cat
in categories}
193 if args.config
is None:
196 if args.showexcludestats:
197 separateIgnoreRegex = [re.compile(line)
for line
in ignorePattern]
198 ignoreDict = {line:0
for line
in ignorePattern}
201 for cat, messages
in resultsA.items():
203 if not igLevels.search(res):
204 results[cat].append(res)
205 elif args.showexcludestats:
206 for i
in range(len(separateIgnoreRegex)):
207 if separateIgnoreRegex[i].
search(res):
208 ignoreDict[ignorePattern[i]] += 1
212 found_bad_message =
False
213 for cat
in categories:
215 if args.printpatterns:
216 print(f
'check_log.py - Checking for {cat} messages with pattern: {str(patterns[cat])} in '+logfile+
'\n')
217 if len(results[cat]) > 0:
218 print(f
'Found {len(results[cat])} {cat} message(s) in {logfile}:')
219 for msg
in results[cat]:
print(msg.strip(
'\n'))
220 found_bad_message =
True
225 if ignoreDict[s] > 0:
226 print(str(ignoreDict[s]) +
"x " + s)
229 if found_bad_message:
230 print(f
'FAILURE : problematic message found in {logfile}')
233 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