package jdbc_02_client;
import java.io.*;
import java.nio.*;
import java.nio.channels.FileChannel;
import java.nio.channels.FileChannel.MapMode;
import java.util.ArrayList;
import java.util.List;
/**
* DataReader类中完成对日志文件的读取,处理,得到所有记录(包括上一次没有匹配上的记录)
* @author soft01
*
*/
public class DataReader {
String logFileName;// 用户登录日志文件位置
String loginsFileName;// 上次未匹配的登录记录文件位置
public DataReader(String log,String logins) {
logFileName = log;
loginsFileName = logins;
}
/**
* 得到日志中的记录集
* @param logFile
* @return 所有记录集
* @throws ReadDataException
* @throws IOException
*/
private List<LogRec> readLogs(String logFile) throws ReadDataException,
IOException {// 读取用户登录记录日志文件的数据
if (true) {
File file = new File(logFile);
FileInputStream fis = new FileInputStream(file);
FileChannel fc = fis.getChannel();
MappedByteBuffer mbb = fc
.map(MapMode.READ_ONLY, 0, fis.available());
int fortime = fis.available() / 373;
System.out.println(fortime);// 打印要采集的用户数量
List<LogRec> login = new ArrayList<LogRec>();// 用来保存登录的记录
for (int i = 0; i < fortime; i++) {
byte[] loginname = new byte[32];
mbb.get(loginname);// 从文件中读入32个的字节并保存到loginname的数组中,得到用户名
String logname = new String(loginname).trim();
mbb.get(new byte[36]);
int pID = mbb.getInt();// 得到 进程号
short logtype = mbb.getShort();// 得到登录类型
mbb.getInt();
mbb.getChar();
long login_time = mbb.getInt() * 1000l;// 得到登录时刻
mbb.get(new byte[30]);
byte[] IP = new byte[257];// 得到客户机IP
mbb.get(IP);
String loginip = new String(IP).trim();
mbb.get();
if ((logtype == 7 || logtype == 8)
&& (!logname.startsWith("."))
&& (!"sun-server".equals(loginip))
&& (!"openlab".equals(logname))
&& (!"adm".equals(logname)) && (!"lp".equals(logname))
&& (!"zsmon".equals(logname))
&& (!"login".equalsIgnoreCase(logname))
&& (!"root".equals(logname))) {
LogRec lr = new LogRec();
lr.setLogname(logname);
lr.setLogtime(login_time);
lr.setLogType(logtype);
lr.setPid(pID);
lr.setLoginip(loginip);
login.add(lr);
}
}
return login;
} else {
new ReadDataException("文件读取失败");
return null;
}
}
/**
* 从暂存文件中读取上次未匹配的登入记录
* @param loginFile
* @return 上次没有匹配成功的记录集
* @throws ReadDataException
* @throws IOException
*/
private List<LogRec> readLogins(String loginFile) throws ReadDataException,
IOException {// 读取上次未匹配的登入记录
File file = new File(loginsFileName);
List<LogRec> list = new ArrayList<LogRec>();
BufferedReader br = new BufferedReader(new InputStreamReader(
new FileInputStream(file)));
String line;
while ((line = br.readLine()) != null) {
String[] record = line.split(" ");
if (record.length == 1)
break;
LogRec lr = new LogRec();
lr.setLogname(record[0]);
lr.setPid(Integer.parseInt(record[1]));
lr.setLogType((short) Integer.parseInt(record[2]));
lr.setLogtime(Long.parseLong(record[3]));
lr.setLoginip(record[4]);
list.add(lr);
}
file.delete();
return list;
}
/**
* 对上面两个方法中的记录集做一个整合,返回最终的一个供处理的记录集
* @return 供处理的记录集
*/
public List<LogRec> getAlllogs() {// 得到采集点前所有登录记录和登出记录(包括上次未匹配的登录记录)
List<LogRec> listAll = new ArrayList<LogRec>();
try {
for (LogRec rec : this.readLogs(logFileName)) {
listAll.add(rec);
}
for (LogRec rec : this.readLogins(loginsFileName)) {
listAll.add(rec);
}
} catch (ReadDataException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return listAll;
}
// public static void main(String[] args) {
// List<LogRec> tt = new DataReader().getAlllogs();
// List<MatchedLogRec> mrlist;
// DataMatcher dm = new DataMatcher();
// try {
// mrlist = dm.mathchLogs(tt);
// BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(
// new FileOutputStream("/home/soft01/Desktop/jian.txt")));// 将已经匹配成功的Match写入到一个文件中
// for (MatchedLogRec rec : mrlist) {
// bw.write(rec.toString());
// bw.newLine();
// }
// bw.close();
// } catch (FileNotFoundException e) {
// e.printStackTrace();
// } catch (MatchDataExcpetion e) {
// e.printStackTrace();
// } catch (IOException e) {
// e.printStackTrace();
// }
}
评论0