Вопрос будет без кода, нужны ваши идеи в плане реализации.
Стоит задача отображать логи работы системы в админке. Пользователь может фильтровать логи по типам событий, может выбирать диапазон времени за которое хочет просмотреть события. Что самое неприятное в этой задаче, та кэто то, что нет какой-то конкретной идеи формирования самого файла логов. В одной подсистеме один файл логов - событие за одни сутки. В другой, один файл это 1 Мбайт логов. В связи с этим приходится писать “универсального бойца”, который к тому же должен быстро работать. Сейчас я изобретаю свой велосипед, но может он уже есть, кто знает подскажите?
Мое решение работает крайне медленно. И выдает порядка 90 секунд на чтение 2-х файлов размер 80 Мбайт каждый.
Алгоритм, который я реализую:
1. Собираю все файлы с расширение .log в массив, который сортирую в порядке убывания даты последнего редактирования файла. (
files = ['file.log', 'file1.log', 'file2.log']
2. Отбрасываю файлы, которые явно не подходят мне по дате.
3. Остальные файлы читаю по очереди по 8 Кбайт (значение получено эмпирическим путем).
4. В каждом куске ищу нахлжу первое вхождение целой строки, проверяю ее дату на вхождение в пользовательский периода. Если дата не входит, беру следующие 8 Кбайт. Если входит. Ищу ту запись которая является приграничной. И т.д. пока не найду приграничную запись конца периода.
4. После чего склеиваю эти словари в один (каждый приходится разворачивать, чтобы сохранить хронологию событий).
P.S. Читаю файл частями, т.к. в связи с неизвестным размером файла лога, могу занять всю память.
Сейчас смотрю в сторону того, чтобы искать (бинарным поиском) границы периода только в файлах
files[0] и files[-1]
files[1:-1]