Форум сайта python.su
Доброго дня.
Вопрос будет без кода, нужны ваши идеи в плане реализации.
Стоит задача отображать логи работы системы в админке. Пользователь может фильтровать логи по типам событий, может выбирать диапазон времени за которое хочет просмотреть события. Что самое неприятное в этой задаче, та кэто то, что нет какой-то конкретной идеи формирования самого файла логов. В одной подсистеме один файл логов - событие за одни сутки. В другой, один файл это 1 Мбайт логов. В связи с этим приходится писать “универсального бойца”, который к тому же должен быстро работать. Сейчас я изобретаю свой велосипед, но может он уже есть, кто знает подскажите?
Мое решение работает крайне медленно. И выдает порядка 90 секунд на чтение 2-х файлов размер 80 Мбайт каждый.
Алгоритм, который я реализую:
1. Собираю все файлы с расширение .log в массив, который сортирую в порядке убывания даты последнего редактирования файла. (
files = ['file.log', 'file1.log', 'file2.log']
files[0] и files[-1]
files[1:-1]
Отредактировано SergeyChmutov (Сен. 4, 2019 10:02:05)
Офлайн
SergeyChmutov
А вы сейчас базу данных не изобретаете?
Офлайн
FishHookВозможно. Но при хранении логов базе можно выстрелить себе в ногу. Например когда база не доступна и соответсвенно логи, по которым можно было бы понять что в системе произошло. Может не так вас понял.
SergeyChmutovА вы сейчас базу данных не изобретаете?
Офлайн
SergeyChmutovЧто значит база недоступна? Вы пишите свои логи в файлы. Ваши файлы могут быть недоступны? База данных это тоже набор файлов, только они особым образом структурированы и индексированы. То что вы сейчас придумываете для ускорения ваших действий
Например когда база не доступна и соответсвенно логи, по которым можно было бы понять что в системе произошло. Может не так вас понял.
SergeyChmutov
читаю по очереди по 8 Кбай
SergeyChmutov
В каждом куске ищу нахлжу первое вхождение целой строки
Офлайн
Да, согласен. Только принято решение (не мной), хранить логи в файлах. Если я иду в сторону изобретение велосипед под название БД, вероятно, это правильно направление (в моем частном случае)?
Офлайн
SergeyChmutovСкорее всего нет. Вообще, когда админские задачи пытаются решать программированием, то скорее всего делают какую-то ерунду. Вы же наверняка не первый человек, которому пришлось обрабатывать большое количество логов? Наверняка есть готовый набор инструментов на любой вкус.
Если я иду в сторону изобретение велосипед под название БД, вероятно, это правильно направление (в моем частном случае)?
Офлайн
SergeyChmutovДля логов нужны не совсем базы данных. Это даже скорее не базы данных.
Только принято решение (не мной), хранить логи в файлах. Если я иду в сторону изобретение велосипед под название БД
Офлайн
SergeyChmutovЭто и замедляет скорость, и даёт неточность, и усложняет код через усложнение алгоритма анализа.
3. Остальные файлы читаю по очереди по 8 Кбайт (значение получено эмпирическим путем).
SergeyChmutovНадо сделать читатель записей лога. То есть сначала ты ему подаешь сырые данные какими-то блоками, он их разделяет по границам записей и выдаёт на выход уже правильно разграниченные записи. И вот когда у тебя получаются точные отдельные записи, тогда с ними и можно работать в плане анализа.
4. В каждом куске ищу нахлжу первое вхождение целой строки, проверяю ее дату на вхождение в пользовательский периода. Если дата не входит, беру следующие 8 Кбайт. Если входит. Ищу ту запись которая является приграничной. И т.д. пока не найду приграничную запись конца периода.
SergeyChmutovНе надо искать в файлах. Это сырые данные. Надо их привести к очищенным данным и искать в очищенных то, что нужно найти.
Сейчас смотрю в сторону того, чтобы искать (бинарным поиском) границы периода только в файлах
Офлайн
SergeyChmutovДобавлю что для выдачи вам идей нужно больше информации.
нужны ваши идеи в плане реализации.
Отредактировано doza_and (Сен. 5, 2019 08:11:52)
Офлайн
В общем вчера копался в своем коде и нашел узкое (действительно узкое место), которое забирало на себя около 80-90% времени выполнения. Стыдно признать этим оказалась пагинация, которая была реализована, по уже подготовленному JSON. Сейчас перенес ее в контроллер. И теперь вуаля). Правда осталось разобраться, как быстро фильтровать события по их типу.
Офлайн