ATLAS Offline Software
Loading...
Searching...
No Matches
check_log Namespace Reference

Functions

 get_parser ()
 main ()
 parseConfig (args)
 scanLogfile (args, logfile, ignorePattern=[])

Variables

dict regexMap = {}
 builtins = dir(builtins)
list builtinErrors = [b for b in builtins if 'Error' in b]
list backtrace
list fpeTracebackStart = [r'FPEAuditor.*INFO FPE stacktrace']
list fpeTracebackCont

Detailed Description

Tool to check for error messages in a log file.

By default ERROR, FATAL and CRITICAL messages are considered.
The config file may be used to provide patterns of lines to exclude from this check
(known problems or false positives). If no config file is provided, all errors will be shown.

Function Documentation

◆ get_parser()

get_parser ( )

Definition at line 85 of file check_log.py.

85def get_parser():
86 parser = argparse.ArgumentParser(description=__doc__, formatter_class=
87 lambda prog : argparse.HelpFormatter(
88 prog, max_help_position=40, width=100))
89
90 parser.add_argument('logfile', metavar='<logfile>', nargs='+',
91 help='log file(s) to scan')
92 parser.add_argument('--config', metavar='<file>',
93 help='specify config file')
94 parser.add_argument('--showexcludestats', action='store_true',
95 help='print summary table with number of matches for each exclude pattern')
96 parser.add_argument('--printpatterns', action='store_true',
97 help='print the list of warning/error patterns being searched for')
98 parser.add_argument('--warnings', action = 'store_true',
99 help='check for WARNING messages')
100 parser.add_argument('--errors', action = 'store_true',
101 help='check for ERROR messages')
102
103 return parser
104
105

◆ main()

main ( )

Definition at line 106 of file check_log.py.

106def main():
107 parser = get_parser()
108
109 args = parser.parse_args()
110 if not (args.errors or args.warnings):
111 parser.error('at least one of --errors or --warnings must be enabled')
112
113 ignorePattern = parseConfig(args) if args.config else []
114 rc = 0
115 for i, lf in enumerate(args.logfile):
116 if i>0:
117 print()
118 rc += scanLogfile(args, lf, ignorePattern)
119
120 return rc
121
122
void print(char *figname, TCanvas *c1)
int main()
Definition hello.cxx:18

◆ parseConfig()

parseConfig ( args)
Parses the config file provided into a list (ignorePattern)

Definition at line 123 of file check_log.py.

123def parseConfig(args):
124 """Parses the config file provided into a list (ignorePattern)"""
125 ignorePattern = []
126
127 os.system(f"get_files -data -symlink {args.config} > /dev/null")
128 with open(args.config) as f:
129 print('Ignoring warnings/error patterns defined in ' + args.config)
130 for aline in f:
131 if 'ignore' in aline:
132 line = aline.strip('ignore').strip()
133 if line.startswith('\'') and line.endswith('\''):
134 line = line[1:-1]
135 ignorePattern.append(line)
136 return ignorePattern
137
138

◆ scanLogfile()

scanLogfile ( args,
logfile,
ignorePattern = [] )
Scan one log file and print report

Definition at line 139 of file check_log.py.

139def scanLogfile(args, logfile, ignorePattern=[]):
140 """Scan one log file and print report"""
141 tPattern = re.compile('|'.join(backtrace))
142 fpeStartPattern = re.compile('|'.join(fpeTracebackStart))
143 fpeContPattern = re.compile('|'.join(fpeTracebackCont))
144 ignoreDict = None
145
146 categories = []
147 if args.warnings is True:
148 categories += ['warning']
149 if args.errors is True:
150 categories += ['error/fatal', 'prohibited', 'python error', 'fpe', 'backtrace']
151
152 # if ignorePattern is empty, igLevels.search would match anything, protect by adding a pattern that matches nothing
153 if not ignorePattern:
154 ignorePattern.append('(?!)')
155
156 igLevels = re.compile('|'.join(ignorePattern))
157
158 patterns = {
159 cat: re.compile('|'.join(regexMap[cat])) for cat in categories
160 }
161 resultsA = {cat:[] for cat in categories}
162 with open(logfile, encoding='utf-8') as f:
163 tracing = False
164 fpeTracing = False
165
166 try:
167 for line in f:
168 # First check if we need to start or continue following a trace
169 # Tracing only makes sense for errors
170 if args.errors:
171 if tPattern.search(line) and not igLevels.search(line):
172 tracing = True
173 elif fpeStartPattern.search(line) and not igLevels.search(line):
174 fpeTracing = True
175 elif line =='\n':
176 tracing = False
177 fpeTracing = False
178
179 if tracing:
180 # Save all lines after a backtrace even if they don't belong to backtrace
181 resultsA['backtrace'].append(line)
182 elif fpeTracing:
183 # Continue following FPE so long as recognised
184 if fpeStartPattern.search(line) or fpeContPattern.search(line):
185 resultsA['fpe'].append(line)
186 else:
187 fpeTracing = False
188 else:
189 for cat in categories:
190 if patterns[cat].search(line):
191 resultsA[cat].append(line)
192 except UnicodeDecodeError as e:
193 print(f'ERROR: Exception raised processing log file: {e}\n')
194
195 ignoreDict = {}
196 results = {cat:[] for cat in categories}
197 if args.config is None:
198 results = resultsA
199 else:
200 if args.showexcludestats:
201 separateIgnoreRegex = [re.compile(line) for line in ignorePattern]
202 ignoreDict = {line:0 for line in ignorePattern} # stores counts of ignored errors/warnings
203
204 # Filter messages
205 for cat, messages in resultsA.items():
206 for res in messages:
207 if not igLevels.search(res):
208 results[cat].append(res)
209 elif args.showexcludestats:
210 for i in range(len(separateIgnoreRegex)):
211 if separateIgnoreRegex[i].search(res):
212 ignoreDict[ignorePattern[i]] += 1
213
214
215 # Report results
216 found_bad_message = False
217 for cat in categories:
218
219 if args.printpatterns:
220 print(f'check_log.py - Checking for {cat} messages with pattern: {str(patterns[cat])} in '+logfile+'\n')
221 if len(results[cat]) > 0:
222 print(f'Found {len(results[cat])} {cat} message(s) in {logfile}:')
223 for msg in results[cat]: print(msg.strip('\n'))
224 found_bad_message = True
225
226 if ignoreDict:
227 print('Ignored:')
228 for s in ignoreDict:
229 if ignoreDict[s] > 0:
230 print(str(ignoreDict[s]) + "x " + s)
231 print('\n')
232
233 if found_bad_message:
234 print(f'FAILURE : problematic message found in {logfile}')
235 return 1
236
237 print(f'No error/warning messages found in {logfile}')
238 return 0
239
240
void search(TDirectory *td, const std::string &s, std::string cwd, node *n)
recursive directory search for TH1 and TH2 and TProfiles
Definition hcg.cxx:743

Variable Documentation

◆ backtrace

list check_log.backtrace
Initial value:
= [
r'Traceback',
r'Shortened traceback',
r'stack trace',
r'^Algorithm stack',
r'^#\d+\s*0x\w+ in ',
]

Definition at line 59 of file check_log.py.

◆ builtinErrors

list check_log.builtinErrors = [b for b in builtins if 'Error' in b]

Definition at line 55 of file check_log.py.

◆ builtins

check_log.builtins = dir(builtins)

Definition at line 54 of file check_log.py.

◆ fpeTracebackCont

list check_log.fpeTracebackCont
Initial value:
= [
' in function : ',
' included from : ',
' in library : ',
]

Definition at line 70 of file check_log.py.

◆ fpeTracebackStart

list check_log.fpeTracebackStart = [r'FPEAuditor.*INFO FPE stacktrace']

Definition at line 69 of file check_log.py.

◆ regexMap

dict check_log.regexMap = {}

Definition at line 17 of file check_log.py.