我有这种网络日志作为文本文件,我想通过将 session 时间视为 30 分钟来从日志中查找 session 。
1 in24.inetnebr.com 01/08/1995:00:00:01 GET /shuttle/missions/sts-68/news/sts-68-mcc-05.txt 200 1839
2 in24.inetnebr.com 01/08/1995:00:00:34 GET /shuttle/missions/sts-68/news/sts-68-mcc-06.txt 200 2303
3 in24.inetnebr.com 01/08/1995:00:05:01 GET /shuttle/missions/sts-68/news/sts-68-mcc-05.txt 200 1839
4 in24.inetnebr.com 01/08/1995:00:30:00 GET /shuttle/missions/sts-68/news/sts-68-mcc-05.txt 200 1839
5 in24.inetnebr.com 01/08/1995:00:30:55 GET /shuttle/missions/sts-68/news/sts-68-mcc-05.txt 200 1839
6 in24.inetnebr.com 01/08/1995:00:35:00 GET /shuttle/missions/sts-68/news/sts-68-mcc-05.txt 200 1839
7 slppp6.intermind.net 01/08/1995:00:00:10 GET
/history/skylab/skylab.html 200 1687
8 slppp6.intermind.net 01/08/1995:00:00:32 GET /history/skylab/skylab-1.html 200 1659
9 slppp6.intermind.net 01/08/1995:00:30:00 GET /history/skylab/skylab.html 200 1687
10 slppp6.intermind.net 01/08/1995:00:35:10 GET
/history/skylab/skylab.html 200 1687
11 133.43.96.45 01/08/1995:00:00:16 GET /shuttle/missions/sts-69/mission-sts-69.html 200 10566
12 133.43.96.45 01/08/1995:00:00:55 GET /shuttle/missions/sts-69/mission-sts-69.html 200 10566
13 133.43.96.45 01/08/1995:00:30:16 GET /shuttle/missions/sts-69/mission-sts-69.html 200 10566
14 133.43.96.45 01/08/1995:00:55:16 GET /shuttle/missions/sts-69/mission-sts-69.html 200 10566
帮助我开发java程序来查找 session 以及我必须使用的数据结构。
package com.pradip.test;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.IOException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Scanner;
public class SessionIdentification {
public static void main(String[] args) throws IOException, ParseException {
Scanner s=new Scanner(new File("E:\\me_3rd\\uniqueurl.txt"));
BufferedWriter writer=new BufferedWriter(new FileWriter(new File("E:\\me_3rd\\sessions.txt")));
SimpleDateFormat format=new SimpleDateFormat("dd/mm/yyyy:HH:mm:ss");
Date d1;
Date d2;
while (s.hasNextLine()) {
String line=s.nextLine();
Scanner s1=new Scanner(new File("E:\\me_3rd\\ordertoIP.txt"));
while(s1.hasNextLine()){
Scanner s2=new Scanner(new File("E:\\me_3rd\\ordertoIP.txt"));
String line1=s1.nextLine();
String sline1[]=line1.split("");
long id=Long.parseLong(sline1[0]);
String timestamp=sline1[2];
if(line.equals(sline1[1])){
while (s2.hasNextLine()) {
String line2=s2.nextLine();
String sline2[]=line2.split(" ");
long id1=Long.parseLong(sline2[0]);
String timestamp1=sline2[2];
d1=format.parse(timestamp);
d2=format.parse(timestamp1);
long diff=d2.getTime()-d1.getTime();
long diffSeconds = diff / 1000 % 60;
long diffMinutes = diff / (60 * 1000) % 60;
long diffHours = diff / (60 * 60 * 1000) % 24;
long diffDays = diff / (24 * 60 * 60 * 1000);
long seconds=(diffDays*24*60*60)+(diffHours*60*60)+(diffMinutes*60)+diffSeconds;
if(seconds<=1800){
continue ;
}
else{
String sessionboundry=id+" "+id1; //id1-1
break;
}
}
}
}
}
}
}
这是我尝试过的,但我不知道下一步该尝试什么
最佳答案
我相信您正在使用 JSF
或 JSP
进行开发。因此,您可以从 FacesContext 中检索 session ID。您只需将此 sessionId 附加到日志中,就可以过滤结果。按照您的要求
FacesContext fCtx = FacesContext.getCurrentInstance();
HttpSession session = (HttpSession) fCtx.getExternalContext().getSession(false);
String sessionId = session.getId();
因为您只对 30 分钟 session 内的阅读和独特日志感兴趣。您可以逐行读取文件并根据内容填充日志列表。 粗略的草图
- 正确格式化您的日志文件。 web/时间戳/方法/状态/操作/状态/ session ID 等
- 以字符串形式逐行读取日志文件。
- 如果符合条件(30 分钟以内),则将日志拆分并保存到 ArrayList 中。
关于java - 使用java程序从Web服务器日志中识别 session ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27898727/