Подтвердить что ты не робот

Слияние и сортировка файлов журнала в Python

Я совершенно не знаком с python, и у меня есть серьезная проблема, которую я не могу решить.

У меня есть несколько файлов журналов с одинаковой структурой:

[timestamp] [level] [source] message

Например:

[Wed Oct 11 14:32:52 2000] [error] [client 127.0.0.1] error message

Мне нужно написать программу в чистом Python, которая должна объединить эти файлы журналов в один файл, а затем отсортировать объединенный файл по метке времени. После этой операции я хочу напечатать этот результат (содержимое объединенного файла) до STDOUT (console).

Я не понимаю, как это сделать, это поможет. Возможно ли это?

4b9b3361

Ответ 1

Вы можете сделать это

import fileinput
import re
from time import strptime

f_names = ['1.log', '2.log'] # names of log files
lines = list(fileinput.input(f_names))
t_fmt = '%a %b %d %H:%M:%S %Y' # format of time stamps
t_pat = re.compile(r'\[(.+?)\]') # pattern to extract timestamp
for l in sorted(lines, key=lambda l: strptime(t_pat.search(l).group(1), t_fmt)):
    print l,

Ответ 2

Во-первых, вы захотите использовать модуль fileinput для получения данных из нескольких файлов, например:

data = fileinput.FileInput()
for line in data.readlines():
    print line

который затем распечатает все строки вместе. Вы также хотите сортировать, что вы можете сделать с отсортированным ключевым словом.

Предполагая, что ваши строки начинались с [2011-07-20 19:20:12], вы золотые, так как этот формат не требует сортировки выше и выше alphanum, так что:

data = fileinput.FileInput()
for line in sorted(data.readlines()):
    print line

Как, однако, у вас есть что-то более сложное, что вам нужно сделать:

def compareDates(line1, line2):
   # parse the date here into datetime objects
   NotImplemented
   # Then use those for the sorting
   return cmp(parseddate1, parseddate2)

data = fileinput.FileInput()
for line in sorted(data.readlines(), cmp=compareDates):
    print line

Для бонусных очков вы даже можете сделать

data = fileinput.FileInput(openhook=fileinput.hook_compressed)

который позволит вам читать файлы gzipped журнала.

Тогда использование будет:

$ python yourscript.py access.log.1 access.log.*.gz

или аналогичный.

Ответ 3

Что касается критической функции сортировки:

def sort_key(line):
    return datetime.strptime(line.split(']')[0], '[%a %b %d %H:%M:%S %Y')

Это должно использоваться как аргумент key для sort или sorted, а не как cmp. Это происходит быстрее.

О, и вы должны иметь

from datetime import datetime

в вашем коде, чтобы сделать эту работу.

Ответ 4

Прочитайте строки обоих файлов в списке (они теперь будут объединены), предоставит пользовательскую функцию сравнения, которая преобразует временную метку в секундах с момента эпохи, сортирует вызов с определенным пользователем сравнением, записывает строки в объединенный файл...

def compare_func():
    # comparison code
    pass


lst = []

for line in open("file_1.log", "r"):
   lst.append(line)

for line in open("file_2.log", "r"):
   lst.append(line)

# create compare function from timestamp to epoch called compare_func

lst.sort(cmp=compare_func)  # this could be a lambda if it is simple enough

что-то подобное должно это сделать