Python logparse поиск конкретного текста - PullRequest
0 голосов
/ 13 мая 2010

Я использую эту функцию в своем коде для возврата строк, которые я хочу получить от чтения файла журнала, я хочу выполнить grep для процесса "exim" и вернуть результаты, но выполнение кода не дает ошибок, но вывод ограничен в три строки, как я могу просто получить вывод, связанный только с exim-процессом ..

#output:
    {'date': '13', 'process': 'syslogd', 'time': '06:27:33', 'month': 'May'}
    {'date': '13', 'process': 'exim[23168]:', 'time': '06:27:33', 'month': 'May'}
    {'May': ['syslogd']}


#function:    
def generate_log_report(logfile):
    report_dict = {}
    for line in logfile:
        line_dict = dictify_logline(line)
        print line_dict
        try:
            month = line_dict['month']
            date = line_dict['date']
            time = line_dict['time']
            #process = line_dict['process']
            if "exim" in line_dict['process']:
                process = line_dict['process']  
                break
            else:
                process = line_dict['process']      
        except ValueError:
            continue
        report_dict.setdefault(month, []).append(process)
    return report_dict

Ответы [ 2 ]

0 голосов
/ 13 мая 2010

Я изменил код на это, но он дает мне только одну строку в качестве вывода ??? ничего не хватает ...

#!/usr/bin/env python

import sys

def generate_log_report(logfile):
        for line in logfile:
                line_split = line.split()
                list = [line_split[0], line_split[1], line_split[2], line_split[4]]
                if "exim" in list[3]:
                        l = [line_split[0], line_split[1], line_split[2], line_split[4]]
                else:
                        li = [line_split[0], line_split[1], line_split[2], line_split[4]]
        return l


if __name__ == "__main__":
        if not len(sys.argv) > 1:
                print __doc__
                sys.exit(1)
        infile_name = sys.argv[1]
        try:
                infile = open(infile_name, "r")
        except IOError:
                print "you must specify a valid file"
                print __doc__
                sys.exit(1)
        log_report = generate_log_report(infile)
        print log_report
        infile.close()
0 голосов
/ 13 мая 2010

Это потому, что у вас есть оператор break внутри if, который проверяет «exim». Как только вы найдете строку с «exim», вы полностью прекратите обработку, что звучит как противоположность того, что вы хотите!

Я думаю, что вы хотите удалить разрыв и поместить вашу распечатку в if. Если ваш вопрос касается возвращаемого значения функции, вам нужно внести гораздо более существенные изменения, возможно, полностью удалив report_dict и просто создав список line_dicts, которые имеют exim в своих полях процесса.

...