自本人的小网站webdw.vicp.net上线以来,
每天都很想关心一下到底有多少人来看过,
但是看access.log太长了,不方便.
痛定思痛,终于下决心写了一个简单的日志统计类,
统计一下每天有多少IP,多少请求次数.
费话不说了,看代码.
package com.liu; import java.io.File; import java.io.FileReader; import java.io.BufferedReader; /** * WebLogic后台的access.log日志访问分析功能类 * * @author liujunsong * */ public class WebLogicLogStat { class logline{ String IP=""; //IP地址 String date =""; //访问日期 int access =0; //访问次数 } public logline logall[] = new logline[10000]; public int logid = 0; public String getLine(int id){ return "<TR><TD>" +logall[id].IP + "</TD>" +"<TD>" +logall[id].date +"</TD>" +"<TD>" +logall[id].access +"</TD>" +"</TR>"; } public String readLogFile() throws Exception{ StringBuffer slogfile =new StringBuffer(""); String filepath = "E://bea//user_projects//domains//mydomain//myserver//"; File beadir = new File(filepath); if (!beadir.exists()) { filepath = "c://bea//user_projects//domains//mydomain//myserver//"; } String filename = "access.log"; filename = filepath + filename; System.out.println("Want access log file:" + filename); File dwfile = new File(filename); if (dwfile.exists()) {// 如果文件存在,才操作,否则不操作 FileReader fstream = new FileReader(filename); BufferedReader in = new BufferedReader(fstream); String record = ""; while ((record = in.readLine()) != null) { System.out.println("record:"+record); slogfile.append((record)+"\r\n"); // 文件输出到输出流去 } in.close(); // 关闭文件输入流 } return slogfile.toString(); } /** * 对日志进行统计,按日,IP来进行统计,统计结果为日:IP:访问次数 * @param slog * @return */ public String stat(String slog){ logid =0; String allline[] = slog.split("\r\n"); int i =0; for (i=0;i<allline.length;i++){ String line = allline[i]; int pos1 =0; int pos2 =0; pos1 = line.indexOf("- - ["); pos2 = line.indexOf("] "); if (pos1<0 || pos2 <0 ){ continue; } String ip = line.substring(0, pos1-1); String d1 = line.substring(pos1 + 5,pos2- 1); //System.out.println(ip+", "+d1); int pos3 = d1.indexOf(":"); if (pos3<0){continue;} String d2 = d1.substring(0,pos3); //System.out.print("ip,d2="+ip+","+d2); int findid = findit(ip,d2); if (findid >0){ logall[findid].access = logall[findid].access +1; }else{ if(logid>1){ if (logall[logid].date.equals(d2)){ //do nothing }else{ //add an new line. logid ++; logall[logid] = new logline(); logall[logid].IP = "----------------"; logall[logid].date = d2; logall[logid].access = logid; } } logid ++; logall[logid] = new logline(); logall[logid].IP = ip; logall[logid].date = d2; logall[logid].access = 1; } } logid ++; logall[logid] = new logline(); logall[logid].IP = "----------------"; logall[logid].date = logall[logid-1].date; logall[logid].access = logid; return ""; } private int findit(String ip,String date){ int i =0 ; for(i=1;i<=logid;i++){ if (logall[i].IP.equals(ip) && logall[i].date.equals(date)){ return i; } } return -1; } }
附件两个压缩包,一个是java类,一个是调用java类的jsp文件
下面是界面的一个切图.
希望对大家有所帮助.
1 楼
cjf068
2012-02-13
效率不高,应该采用hash或boomfilter来存储ip,快速查找,同一个ip出现后累加即可。