#161 logview: Use dateutil for date parsing
Merged 3 years ago by kevin. Opened 3 years ago by darknao.
fedora-infra/ darknao/ansible logview_date  into  master

file modified
+29 -27
@@ -1,35 +1,39 @@ 

  #!/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))

hm, do you need the lambda here?

Ah, yes you do otherwise the dc() below won't work

+     return dc().strftime("%Y/%m/%d")

+ 

  

  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")
@@ -45,10 +49,11 @@ 

          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')
@@ -57,7 +62,7 @@ 

                  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:
@@ -69,8 +74,8 @@ 

                          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:
@@ -80,7 +85,7 @@ 

                                  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:
@@ -88,28 +93,25 @@ 

                      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:]))

-     

This remove the old /bin/date trick to parse the date and use the dateutil module instead.
I've tried to keep the previous date term usage like 'today' or 'yesterday'.
dateutil also allow a more flexible date format, with many possibilities.

rebased onto 57fe18f286aa5c1797899be3b50a02eebdcfab1d

3 years ago

rebased onto 57fe18f286aa5c1797899be3b50a02eebdcfab1d

3 years ago

hm, do you need the lambda here?

Ah, yes you do otherwise the dc() below won't work

:thumbsup: for the change, but I'll let someone more familiar w/ the script merge it so it can be tested after the merge to ensure it works as expected :)

rebased onto 3696752

3 years ago

rebased onto 3696752

3 years ago

Pull-Request has been merged by kevin

3 years ago
Metadata