Парсер логов (1)

  • 36
  • Недоступна
Сегодня мы напишем парсер логов. Лог файл имеет следующий формат: ip username date event status Где: ip - ip адрес с которого пользователь произвел событие. user - имя пользователя (одно или несколько слов разделенные пробелами). date - дата события в формате day.month.year hour:minute:second. event
Вы не можете решать эту задачу, т.к. не залогинены.
Комментарии (137)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Артём
Уровень 41, Нижний Новгород, Россия
около 4 часов назад
Классная задача, пришлось напрячь мозг. Прикольно что тут дают свободу выбора, т.е. делай как хочешь лишь бы работало. Поэтому я подумал логично ввести отдельй класс, в котором инкапсулируется запись логга. Подвело только то, что использовал "var" при объявлении переменной а не "File[]". Похоже тут java до 10 версии.
profitroll Software Developer в Алроса
5 октября, 05:32
Сперва сделал коллекцию для хранения записей лога с типом TreeSet, упорядоченную по дате. Валя ни в какую не хотел принимать готовое решение. Сменил тип этой коллекции на ArrayList - Валя принял...
Anton Stezhkin
Уровень 40
10 августа, 11:00
Перепутал в логике before и after. 😓 -5 попыток! Не будьте как я.
Maks Panteleev
Уровень 41, Москва, Россия
26 июля, 21:49
Блин, смешанные эмоции. Задача - великолепная. Супер интересная, сидел 4 часа над ней, все сделал офигенно, все проверил, все работает четко как часики... Но валидатор испортил все эмоции от прекрасно проделанной работы. Я сделал вот что: Естественно создал доп класс, мы же тут ООП банда, туда поля все наши характеристики. Дальше пошло величие. Первый метод dataCreator: 1)Files.list по директории и пишем в лист все файлы, через стрим проверяя заодно окончание 2) в цикле по листу для каждого файла мы пишем строчку - разбираем сплитом ее на таб, собираем объект и пишем в новый лист уже объект. Так мы собираем лист объектов, каждый из которых содержит данные о строчке лога. лист у нас поле парсера второй метод геттер для поля третий метод с помощью такой штуки
result = result.stream().distinct().collect(Collectors.toList());
превращает переданный список в список айпи стрингов и удаляет повторы четвертый метод моя гордость моя прелесть - генератор предикатов он получает даты - и возвращает предикат, который потом используется в стриме для фильтра Дальше дело техники - getNumberOfUniqueIPs 1)получаем список объектов-строчек лога 2) пишем компаратор по дате 3) сортируем стримом, используя фильтр(предикатор из предыдущего метода) 4) убираем повторы и возвращаем дальше все примерно так же только фильтруем стрим по разному. Все красиво и лаконично... п.с. вместо && у меня было || поэтому не проходило)))
Anton Stezhkin
Уровень 40
10 августа, 11:02
Справедливости ради, валидатор в этом конкретном случае не виноват!
Дмитрий
Уровень 41
22 июля, 12:45
решено
... нужно возвратить данные касающиеся только данного периода (включая даты after и before)
на самом деле - НЕТ не включая даты after и before нужно использовать операторы < / > или Date.before/after ------ и удалите все комменты перед валидацией, валя - странный
Igor
Уровень 41, Минск, Беларусь
14 июля, 15:10
Не работает решение от Вали в том случае, если в директории есть ещё папки в которой есть log-файлы. Вроде бы DirectoryStream - возвращает только Path тех файлов которые находятся в этой папке. По хорошему тут нужно создать возврат в этот же метод, если Path это директория. Если делать такую фичу, чтобы перерывала все папки, то Валя не примет. Хотя как мне кажется, это логично, чтобы фича эта была. Если лог файл разбивается по размеру/времени и т.п. и переносится в другую директорию согласно, например, времени.
Anton Stezhkin
Уровень 40
10 августа, 11:07
В реальных условиях надо или не надо заходить в поддиректории было бы написано в ТЗ. Но это учебная задачка, так что -1 попытка чтобы выяснить нужно или нет. Вообще мне кажется, что в учебных задачках по умолчанию нужно делать выбор в сторону "не делать". Обычно у меня принимались решения, где я выбирал "не делать".
Денисян
Уровень 41, Калининград, Россия
6 июля, 17:58
задача хороша, но подбор правильного кода под валидатор при правильной выдаче результата - это печально
jimaltair
Уровень 41, Калининград, Россия
26 мая, 14:06
интересная задачка, хоть и просидел над ней ни один час, но понравилась. самый большой затык был при сравнении дат. весь код метода не выкладываю, но вот концовка которую у меня не принимал валидатор:
return date.after(after) || date.equals(after) && date.before(before) || date.equals(before);
а принял вот такой вариант
return date.after(after) && date.before(before);
Но так в условии же сказано: ...нужно возвратить данные касающиеся только данного периода (включая даты after и before). Вот я и добавил условие по сравнению дат через equals! То ли валидатор противоречит условиям задачи, то ли я чего то не так понял
Flexo Bending Unit #3370318
4 мая, 15:23
Решил, протестил, валиднул (нет) Споткнулся на пункте
Метод getIPsForEvent(Event, Date, Date) класса LogParser должен возвращать IP адреса, с которых было произведено переданное событие за выбранный период.
а вот и решение если на часах 12 дня, то часы парсятся как 0 часов => дата (со временем) ошибочная видимо, тесты на сервере проходят на том же тестовом логе, который плагин помещает в директорию, там Вася Пупкин аккурат в 12 часов задачу решил, проверочную дату для получения айпи по событиям выбрали рядом с датой этой записи
Питруха
Уровень 41
2 мая, 04:06
Начал было ругаться на валидатор, но заметил что я неправильно парсю дату. Вместо dd.MM.yyyy писал MM.dd.yyyy