Line Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102
#! /usr/bin/env python3


def manipulate_log(logfile_name,category_names,printBeginEvent,printMessageLabel,verbosityLevel):

    # open file and read it 
    logfile=open(logfile_name,'r')

    writeOut = False

    for line in logfile:

        # real line a split content
        line = line[:-1] # no \n
        line_content_list = line.split(' ')

        # select interesting fields
        identifier = line_content_list[0]
        if len(line_content_list) > 1 :
            category = line_content_list[1]

        # end of message record
        if writeOut == True and identifier != '%MSG' :
            print(line)

        # begin of message record
        if identifier.find('%MSG') != -1 :
            if identifier == '%MSG' :
               writeOut = False
            else :
               isCategory = False
               if len(category_names) == 1 and category_names[0] == '':
                   isCategory = True
               else:
                   for value in category_names :
                       if value+":" == category :
                           isCategory = True
               if isCategory == True:
                   if verbosityLevel == '' :
                       writeOut = True
                   elif identifier == '%MSG-'+verbosityLevel :
                       writeOut = True
               if printMessageLabel and writeOut :
                   print(line)

        # begin event record
        if printBeginEvent and identifier == 'Begin' and category == 'processing' :
            print(line)

    logfile.close()

#################################################################################################    

if __name__ == '__main__':

    import argparse
    import os

    # Here we define an option parser to handle commandline options..
    parser = argparse.ArgumentParser(description='edmMLParser <options> <input file>')
    parser.add_argument('logfile_name',
                        metavar='file',
                        help='input file name')

    parser.add_argument('-c', '--category',
                        help='List of MessageLogger categories to be searched, separated by ","',
                        default='',
                        dest='category_name')

    parser.add_argument('-b', '--print-begin-event',
                        help='Print the begin event record',
                        action='store_true',
                        dest='printBeginEvent')

    parser.add_argument('-m', '--print-message-label',
                        help='Print the MessageLogger label for the selected message',
                        action='store_true',
                        dest='printMessageLabel')

    allowedVerbosityLevels = ['!','i','w','e']

    parser.add_argument('-v', '--select-verbosity-level',
                        help='Select a particular verbosity level for the chosen category, possible values are: '+''.join(allowedVerbosityLevels),
                        default='',
                        dest='verbosityLevel')

    args = parser.parse_args()

    # Now some fault control..If an error is found we raise an exception
    if args.logfile_name=='':
        raise Exception('Please select a file name and a MessageLogger category!')

    if not os.path.exists(args.logfile_name):
        raise Exception('File to be parsed not present!')

    if args.verbosityLevel != '' and args.verbosityLevel not in allowedVerbosityLevels :
        raise Exception('Selected verbosity level not supported')

    category_names = args.category_name.split(',')

    #launch the function!
    manipulate_log(args.logfile_name,category_names,args.printBeginEvent,args.printMessageLabel,args.verbosityLevel)