From 3696752d08b6d0e40bc9bf65ffcaca807588ca3c Mon Sep 17 00:00:00 2001 From: Francois Andrieu Date: Jul 16 2020 18:29:34 +0000 Subject: [PATCH 1/2] logview: use dateutil for date parsing Signed-off-by: Francois Andrieu --- diff --git a/scripts/logview b/scripts/logview index bd79c35..3bdba7c 100755 --- a/scripts/logview +++ b/scripts/logview @@ -1,20 +1,24 @@ #!/usr/bin/python3 import sys import json -import time from optparse import OptionParser -import subprocess import os import glob +from datetime import date, timedelta +import dateutil.parser as dateparser + +logpath = '/var/log/ansible' +search_terms = ['CHANGED', 'FAILED'] +date_terms = { + "today": date.today, + "yesterday": lambda: date.today() - timedelta(1), +} -logpath='/var/log/ansible' -search_terms=['CHANGED','FAILED'] def date_cheat(datestr): - dc = subprocess.Popen(['date', '-d', datestr, '+%Y/%m/%d'], stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate()[0] - dc = dc.strip().decode() - return dc - + dc = date_terms.get(datestr, lambda: dateparser.parse(datestr)) + return dc().strftime("%Y/%m/%d") + def parse_args(args): usage = """ From 777637f7a67a5b8f6b004d3b3582ae56d40d9780 Mon Sep 17 00:00:00 2001 From: Francois Andrieu Date: Jul 16 2020 18:29:34 +0000 Subject: [PATCH 2/2] logview: minor pep8 fixups Signed-off-by: Francois Andrieu --- diff --git a/scripts/logview b/scripts/logview index 3bdba7c..03ed34e 100755 --- a/scripts/logview +++ b/scripts/logview @@ -23,17 +23,17 @@ def date_cheat(datestr): def parse_args(args): usage = """ logview [options] [-d datestr] [-p playbook] - + examples: logview -d yesterday -l # lists playbooks run on that date - + logview -s OK -s FAILED -d yesterday # list events from yesterday that failed or were ok - + logview -s CHANGED -d yesterday -p mirrorlist # list events that changed from the mirrorlist playbook - + logview -s ANY -d yesterday -p mirrorlist # list all events from the mirrorlist playbook - - + + """ parser = OptionParser(usage=usage) parser.add_option("-d", default='today', dest='datestr', help="time string of when you want logs") @@ -49,10 +49,11 @@ def parse_args(args): opts.search_terms = search_terms return opts, args + def search_logs(opts, logfiles): msg = '' for fn in sorted(logfiles): - hostname=os.path.basename(fn).replace('.log', '') + hostname = os.path.basename(fn).replace('.log', '') timestamp = os.path.basename(os.path.dirname(fn)) for line in open(fn): things = line.split('\t') @@ -61,7 +62,7 @@ def search_logs(opts, logfiles): continue # See callback_plugins/logdetail.py for how these lines get created. - #MSG_FORMAT="%(now)s\t%(count)s\t%(category)s\t%(name)s\t%(data)s\n" + # MSG_FORMAT="%(now)s\t%(count)s\t%(category)s\t%(name)s\t%(data)s\n" task_ts, count, category, name, data = things if category in opts.search_terms or 'ANY' in opts.search_terms: @@ -73,8 +74,8 @@ def search_logs(opts, logfiles): dur = '%.2f' % (float(end) - float(st)) else: dur = None - - msg += '%s\t%s\t%s\t%s\t%s\t%s' % ( + + msg += '%s\t%s\t%s\t%s\t%s\t%s' % ( timestamp, hostname, task_ts, count, category, name) if not opts.verbose: @@ -84,7 +85,7 @@ def search_logs(opts, logfiles): msg += '\t%s:%s' % (term, slurp.get(term, None)) if opts.profile and dur: msg += '\t%s:%s' % ('dur', dur) - + msg += '\n' else: if opts.profile and dur: @@ -92,28 +93,25 @@ def search_logs(opts, logfiles): msg += '\n' msg += json.dumps(slurp, indent=4) msg += '\n' - return msg - + def main(args): - opts,args = parse_args(args) - for pb in glob.glob(os.path.join(logpath,opts.playbook)): + opts, args = parse_args(args) + for pb in glob.glob(os.path.join(logpath, opts.playbook)): pb_name = os.path.basename(pb) for pb_logdir in glob.glob(os.path.join(pb, opts.datestr)): if opts.list_pb: print(pb_name) continue - + logfiles = glob.glob(pb_logdir + '/*/*.log') msg = search_logs(opts, logfiles) if msg: print(pb_name) print(msg) - - + if __name__ == "__main__": sys.exit(main(sys.argv[1:])) -