Слияние и сортировка файлов журнала в Python
Я совершенно не знаком с python, и у меня есть серьезная проблема, которую я не могу решить.
У меня есть несколько файлов журналов с одинаковой структурой:
[timestamp] [level] [source] message
Например:
[Wed Oct 11 14:32:52 2000] [error] [client 127.0.0.1] error message
Мне нужно написать программу в чистом Python, которая должна объединить эти файлы журналов в один файл, а затем отсортировать объединенный файл по метке времени. После этой операции я хочу напечатать этот результат (содержимое объединенного файла) до STDOUT
(console).
Я не понимаю, как это сделать, это поможет. Возможно ли это?
Ответы
Ответ 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
что-то подобное должно это сделать