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

  • 36
  • Недоступна
Сегодня мы напишем парсер логов. Лог файл имеет следующий формат: ip username date event status Где: ip - ip адрес с которого пользователь произвел событие. user - имя пользователя (одно или несколько слов разделенные пробелами). date - дата события в формате day.month.year hour:minute:second. event
Вы не можете решать эту задачу, т.к. не залогинены.
Комментарии (139)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Maks Panteleev
Уровень 39, Москва, Россия
26 июля, 21:49
Блин, смешанные эмоции. Задача - великолепная. Супер интересная, сидел 4 часа над ней, все сделал офигенно, все проверил, все работает четко как часики... Но валидатор испортил все эмоции от прекрасно проделанной работы. Я сделал вот что: Естественно создал доп класс, мы же тут ООП банда, туда поля все наши характеристики. Дальше пошло величие. Первый метод dataCreator: 1)Files.list по директории и пишем в лист все файлы, через стрим проверяя заодно окончание 2) в цикле по листу для каждого файла мы пишем строчку - разбираем сплитом ее на таб, собираем объект и пишем в новый лист уже объект. Так мы собираем лист объектов, каждый из которых содержит данные о строчке лога. лист у нас поле парсера второй метод геттер для поля третий метод с помощью такой штуки
result = result.stream().distinct().collect(Collectors.toList());
превращает переданный список в список айпи стрингов и удаляет повторы четвертый метод моя гордость моя прелесть - генератор предикатов он получает даты - и возвращает предикат, который потом используется в стриме для фильтра Дальше дело техники - getNumberOfUniqueIPs 1)получаем список объектов-строчек лога 2) пишем компаратор по дате 3) сортируем стримом, используя фильтр(предикатор из предыдущего метода) 4) убираем повторы и возвращаем дальше все примерно так же только фильтруем стрим по разному. Все красиво и лаконично... п.с. вместо && у меня было || поэтому не проходило)))
Дмитрий
Уровень 38
22 июля, 12:45
решено
... нужно возвратить данные касающиеся только данного периода (включая даты after и before)
на самом деле - НЕТ не включая даты after и before нужно использовать операторы < / > или Date.before/after ------ и удалите все комменты перед валидацией, валя - странный
Igor
Уровень 36, Минск, Беларусь
14 июля, 15:10
Не работает решение от Вали в том случае, если в директории есть ещё папки в которой есть log-файлы. Вроде бы DirectoryStream - возвращает только Path тех файлов которые находятся в этой папке. По хорошему тут нужно создать возврат в этот же метод, если Path это директория. Если делать такую фичу, чтобы перерывала все папки, то Валя не примет. Хотя как мне кажется, это логично, чтобы фича эта была. Если лог файл разбивается по размеру/времени и т.п. и переносится в другую директорию согласно, например, времени.
Денисян
Уровень 32, Калининград, Россия
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
gen Люблю нашКодить в свободное время
31 марта, 12:14
Нормальная задача. Не загонялся со сложностями. Валидатор принял с 3-й попытки. Прокололся на event. Два события имеют параметры, поэтому equals(event.toString) не прокатило.
I_Gubenko
Уровень 41
3 марта, 19:50
Всего эту задачу решили 1863 учеников отличная задача! спасибо, получил удовольствие!
Edffom
Уровень 33, Мирный, Россия
27 февраля, 08:37
Решил с 4 попытки. Вынос мозга. На след день переделал полностью код - создал отдельный ENUM с полями лога и метод к нему который обрабатывает запросы и заполняет ими хэшмап. Интересно как будет дальше. У кого проблема с датами - у меня так приняло if (after == null) after = new Date(0); if (before == null) before = new Date(Long.MAX_VALUE); DateFormat dateFormat = new SimpleDateFormat("dd.MM.yyyy HH:mm:ss"); Date getAfter = dateFormat.parse(dateFormat.format(after)); Date getBefore = dateFormat.parse(dateFormat.format(before));