Логика следующая: по каждой строке из лога создается экземпляр Entry:
class Entry{
    public String ip;
    public String user;
    public Date date;
    public String event;
    public String task;
    public String status;

    public Entry(String line) {
        String[] tmp = line.split("\t");
        this.ip = tmp[0];
        this.user = tmp[1];
        try {
            this.date = formatter.parse(tmp[2]);
        }catch (ParseException ignored){}
        this.event = tmp[3].split(" ")[0];
        this.task = tmp[3].split(" ")[1];
        this.status = tmp[4];
    }
}
По которому с помощью стримов и рефлекции уже отсеиваем данные в соответствие с query:
HashSet<Object> result = new HashSet<>();
            result.addAll(lines.stream()
                    .map(l -> new Entry(l))
                    .filter(e -> {
                        try {
                            Field f = e.getClass().getDeclaredField(queryArr[3]);
                            if(queryArr[3].equals("date")) return (formatter.parse(queryValue).compareTo((Date) f.get(e)) == 0);
                            return f.get(e).equals(queryValue);
                        }catch (Exception ignored){}
                        return false;
                    })
                    .map(p -> {
                        try {
                            Field f = p.getClass().getDeclaredField(queryArr[1]);
                            return f.get(p);
                        }catch (Exception ignored){}
                        return null;
                    })
                    .collect(Collectors.toSet()));
return result;
Решение рабочее, но валидтор ругается на все пункты с рекомендацией от менторов для п2: Метод execute неправильно формирует множество IP адресов. Не могу понять в чем причина, помогите плиз.