我的服务器日志格式如下:
128.33.100.1 2011-03-03 15:25 test.html
我需要从中提取一些内容,但我主要关注的是如何获得每小时的总访问次数以及每页唯一身份访问者的数量。任何指针都会受到赞赏。
答案 0 :(得分:0)
假设您的日志文件中只有这些行。以下是我认为你应该如何做到这一点。 (这是假设数据库不参与)
创建一个代表每一行(模型)的类,具有IP,日期,时间,文件
您可以在此模型上添加一个方法,该方法根据日期时间返回一个java时间戳。
然后创建一个哈希映射,它将文件名作为键存储,并将上述类的对象列表作为值
一次开始阅读一行。
每行 一个。使用StringTokenizer将IP,日期,时间和文件作为标记获取 湾填充上面的类的对象 C。将此对象附加到与哈希映射中的文件名匹配的列表中。 (如果不存在则创建新的)
现在,您拥有可用数据结构中的所有数据。
获取每个页面的唯一身份访问者数量: 1.只需检索对应于正确文件名表单哈希映射的列表。您可以运行一个简单的算法来计算唯一IP地址的数量。您还可以使用Java Collections功能执行此操作。
获取每个页面的每小时访问次数: 1.再次检索上面的正确列表,并查看最小和最大时间戳。 2.找出时间。然后将列表中的总条目除以小时数。
希望有所帮助。
答案 1 :(得分:0)
从日志中解析行时:
答案 2 :(得分:0)
如果你将线分成一个数组,我会建议从第三个元素中抽出一小时,并从第一次看到15到第一次看到之前以同样的方式检查所有前面的行16,用计数器存储当时的命中数。
分割字符串可以这样做:
String[] temp;
String str = "firstElement secondElement thirdElement";
String delimiter = " ";
temp = str.split(delimiter); //temp be filled with three elements.
就每页唯一访问者而言,您可以获取用于拆分的数组的第一个元素,并将该值放入HashMap中,并将该IP值作为键,并将它们访问的页面作为值。然后使用每个进入的IP检查HashMap,如果它不在其中,请插入它,最后你将得到一个填充了唯一元素/ IP的HashMap。
希望能给你一些帮助。
答案 3 :(得分:0)
转换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
*/
}
}