參觀人數我有格式化這樣的服務器日誌:每小時
128.33.100.1 2011-03-03 15:25 test.html
我需要從中提取一些東西,但我主要是卡在如何讓每小時訪問的總數以及作爲每頁獨立訪問者的數量。任何指針將不勝感激。
參觀人數我有格式化這樣的服務器日誌:每小時
128.33.100.1 2011-03-03 15:25 test.html
我需要從中提取一些東西,但我主要是卡在如何讓每小時訪問的總數以及作爲每頁獨立訪問者的數量。任何指針將不勝感激。
假設您的日誌文件中只有這些行。我認爲你應該這樣做。 (這是假設數據庫不參與)
創建一個代表每一行(模型),其IP,日期,時間類,文件
您可以在這個模型中添加一個方法,該方法基於日期時間返回一個java時間戳。
然後創建存儲文件名如上類的對象鍵和列表作爲值
開始閱讀在時間線上的哈希映射。
對於每一行 a。使用StringTokenizer獲取IP,日期,時間和文件作爲標記 b。填寫上述類別 的對象c。將此對象附加到與哈希映射中的文件名匹配的列表。 (如果其中一個不存在,則創建新的)
現在,您擁有可用數據結構中的所有數據。
要獲得唯一身份訪問者人數爲每個頁面: 1.只需檢索對應於正確的文件名形式散列映射列表。這可以運行一個簡單的算法來計算唯一IP地址的數量。您還可以使用Java集合功能來執行此操作。
要獲得每頁每小時的訪問次數: 1.再次檢索如上所述的正確列表,並查找最小和最大時間戳。 2.找出以小時計的時間。然後將列表中的總條目分爲幾小時。
希望有所幫助。
在解析從日誌行做:
如果要拆分行成一個陣列,我會建議從第三個元素中抽出小時,並從第一次看到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。
希望能給你一些幫助。
轉換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
*/
}
}