Количество посетителей в час

#java

#java

Вопрос:

У меня есть журнал сервера, отформатированный следующим образом:

128.33.100.1 2011-03-03 15:25 test.html 

Мне нужно извлечь из этого несколько вещей, но я в основном зациклен на том, как получить общее количество посещений в час, а также количество уникальных посетителей на страницу. Любые указания были бы оценены.

Ответ №1:

Предполагая, что в вашем файле журнала есть только эти строки. Вот как, я думаю, вам следует это сделать. (Предполагается, что база данных не задействована)

  1. Создайте класс, который представляет каждую строку (модель), содержащую IP, дату, время, файл

  2. Вы можете добавить метод в эту модель, который возвращает временную метку java на основе даты.

  3. Затем создайте хэш-карту, которая хранит имя файла в виде ключей и список объектов вышеуказанного класса в виде значений

  4. Начинайте читать по строчке за раз.

  5. Для каждой строки a. Используйте StringTokenizer, чтобы получить IP, дату, время и файл в качестве токенов b. Заполните объект вышеуказанного класса c. Добавьте этот объект в список, соответствующий имени файла в хэш-карте. (создайте новый, если он не существует)

  6. Теперь у вас есть все данные в удобной структуре данных.

Чтобы получить количество уникальных посетителей для каждой страницы: 1. Просто извлеките список, соответствующий правильному имени файла, из формы хэш-карты. Здесь вы можете запустить простой алгоритм для подсчета количества уникальных IP-адресов. Для этого также можно использовать функциональность Java Collections.

Чтобы получить количество посещений в час для каждой страницы: 1. снова извлеките правильный список, как указано выше, и установите отметку минимального и максимального времени. 2. узнайте время в часах. затем разделите общее количество записей в списке на часы.

Надеюсь, это поможет.

Ответ №2:

Если вы разбиваете строку на массив, я бы предложил вычленить час из 3-го элемента и выполнить проверку для всех предыдущих строк таким же образом, начиная с первого раза, когда вы видите 15, до первого раза, когда вы видите 16, со счетчиком, хранящим количество обращений за этот час.

Разделение строки может быть выполнено следующим образом:

 String[] temp;
String str = "firstElement secondElement thirdElement";
String delimiter = " ";
temp = str.split(delimiter); //temp be filled with three elements.
  

Что касается уникальных посетителей на страницу, вы можете взять 1-й элемент массива, который вы использовали для разделения, и поместить это значение в HashMap со значением этого IP в качестве ключа и страницы, которую они посетили, в качестве значения. Затем выполните проверку хэш-карты с каждым входящим IP-адресом, и если его нет в it, вставьте его, и к концу у вас будет хэш-карта, заполненная уникальными элементами / IP-адресами.

Надеюсь, это вам немного поможет.

Ответ №3:

Преобразуйте записи журнала в java.util.Calendar , а затем выполните свои вычисления для каждого уникального IP-адреса.

 import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

public class Visit 
{
    public static void main(String[] args) throws Exception
    {
        String []stats = "128.33.100.1 2011-03-03 15:25 test.html".split("\s "); 

        System.out.println("IP Address: "   stats[0]);

        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd hh:mm");
        Date date = formatter.parse(stats[1] " " stats[2]); 
        Calendar cal = Calendar.getInstance();
        cal.setTime(date);
        System.out.println("On Date: "   cal.get(Calendar.DATE)  "/"   cal.get(Calendar.MONTH)  "/"   cal.get(Calendar.YEAR));
        System.out.println("At time: "   cal.get(Calendar.HOUR_OF_DAY)  ":"   cal.get(Calendar.MINUTE));
        System.out.println("Visited page: "   stats[3]);

        /*
         * You have the Calendar object now perform your maths
         */

    }
}
  

Ответ №4:

При разборе строки из журнала не:

  • Выделите словарь (это должно быть сделано только один раз при запуске программы)
  • Извлеките часть даты и времени
  • Преобразуйте его в объект DateTime (.NET) или аналогичный объект для вашего языка программирования
  • Установите для минут и секунд объекта date time значение 0
  • Поместите дату и время в объект Dictionary, если он еще не существует.
  • Увеличьте значение в элементе словаря, где Date time — это ваша текущая проанализированная дата-время
  • В конце концов, этот словарь будет иметь ежечасные обращения