?? dataparser.java
字號:
package dms.business.collectProcess;
import java.io.File;
import java.io.IOException;
import java.nio.MappedByteBuffer;
import java.util.Vector;
import dms.data.LogRecord;
import dms.util.FileUtil;
public class DataParser {
private String historyLocationFile;
private String labIP;
/**
* 解析緩沖的內存結構,
* @param logBuffer 要解析的本地內存緩沖
* @param logout 返回解析后的登出數據
* @param login 返回解析后的登錄數據
* @throws ClassNotFoundException historyLocationFile異常
* @throws IOException historyLocationFile異常
*/
public void parseLogBuffer(MappedByteBuffer logBuffer,
Vector<LogRecord> logouts,
Vector<LogRecord> logins) throws IOException, ClassNotFoundException {
init();
long bufferSize = logBuffer.capacity();//緩沖區容量
int size = (int) (bufferSize/372);//日志記錄條數(每條記錄372字節)
System.out.println("size:"+size);
int historyLocation = 0;//上次采集結束位置
if(new File(historyLocationFile).exists()){
historyLocation =(Integer) FileUtil.active(historyLocationFile);
System.out.println("historyLocation:"+historyLocation);
}
int count = 0;
int number=500;
int j=historyLocation;
int longinnumber = 0;
for(int i = historyLocation ; i < size ; i++){
if(count++ == number){//如果本次采集超過100條,則結束本次采集,防止源文件太大,導致內存溢出。
break;
}
logBuffer.position(i*372);//定位在每條記錄的開頭位置
byte[] loginName = new byte[32];//000-031字節代表用戶登錄名
logBuffer.get(loginName);
String userLoginName = new String(loginName).trim();//用戶登錄名
logBuffer.get(new byte[36]);//跳過無用的字段
int processID = logBuffer.getInt();//進程ID
short type = logBuffer.getShort();//該條記錄的類型:7代表登錄,8代表登出
logBuffer.get(new byte[6]);//跳過無用的字段
long visitTime = logBuffer.getInt()*1000L;//在日志文件中生成該條記錄的時間(毫秒)
visitTime+=logBuffer.getInt();//累加毫秒
logBuffer.get(new byte[26]);//跳過無用的字段
byte[] remote = new byte[257];//記錄ip
logBuffer.get(remote);
String userIP = new String(remote).trim();
if(!userLoginName.startsWith(".") && (type == 7 || type == 8) &&
(!userLoginName.equals("root"))){//過濾掉用戶名以.開頭的記錄
LogRecord logRecord = new LogRecord();
logRecord.setUserIp(userIP);
logRecord.setPid(processID);
logRecord.setUserName(userLoginName);
logRecord.setVisitTime(visitTime);
logRecord.setLabIp(labIP);
// Date date = new Date(visitTime);
// System.out.println("userName: "+userLoginName+"\t pid: "+processID+"\t type: "+type+"\t logTime: "+date+"\t ip:"+userIP);
if(type == 7){//登錄記錄放入login Vector
logins.addElement(logRecord);
longinnumber++;
}
if(type == 8){//登出記錄放入logout Vector
logouts.addElement(logRecord);
}
}
historyLocation = i+1;
}
FileUtil.passivate(historyLocationFile, historyLocation);//把本次采集結束位置寫入文件,下次采集直接定位到這個位置,開始采集
if(size-j > number){
System.out.println("本次一共解析"+number+"條"+"。登錄:"+longinnumber+"條"+",登出:"+logouts.size()+"條");
}else{
System.out.println("本次一共解析"+(size-j)+"條"+"。登錄:"+longinnumber+"條"+",登出:"+logouts.size()+"條");
}
}
private void init(){
historyLocationFile = FileUtil.getHistoryLocationFile();
labIP = FileUtil.getLabIP();
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -