📄 processruntime.java
字号:
/**
*
*/
package logfileAnalyse;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.*;
/**
* @author Jack
*
*/
public class ProcessRunTime extends ProcessCount {
private String pattern1 = "([0-9])([0-9])([0-9])([0-9])([0-9])([0-9])";
private String pattern2 = "([0-9])([0-9])(:)([0-9])([0-9])(:)([0-9])([0-9])";
private static final int PRINT_MAX_LENGTH = 60;
private Map<String, Event> processRun;
private Map<String, Record> record;
private static final int START_EVENT = 1;
private static final int EXIT_EVENT = 2;
private static final int NEW_ID = 0;
private static final int OLD_ID = 1;
private int EVENT_TO_PROCESSID = 5;
private String startEvt;
private String exitEvt;
private String ymd;
private String hms;
private String event;
private String sProcess;
private String sProcessId;
private String sUser;
private String sDomain;
private String sLogon;
/**
*
*/
public ProcessRunTime() {
startEvt = "592";
exitEvt = "593";
processRun = new TreeMap<String, Event>();
record = new TreeMap<String, Record>();
}
/**
* Accept filename to be analysed
*
* @param fileIn
* filename to be analysed
*/
public ProcessRunTime(String filename) {
this();
fileIn = new File(filename);
if (!fileIn.exists()) {
System.err.println(filename + " doses not exits.");
System.exit(1);
}
fileNum++;
}
/*
* Processes the data(from the log file ) one line at a time, tokenizes the
* events and match main fields then stores the process name in a TreeMap
* with the process name as the key and the offset time of exit and start
* of the process as the value.
*/
public void calculate() {
BufferedReader reader = null;
String line = null;
StringTokenizer st = null;
try{
reader = new BufferedReader(new FileReader(fileIn));
line = reader.readLine();
while(line != null) {
st = new StringTokenizer(line, DELIMITER);
while(st.hasMoreTokens()) {
String token = st.nextToken();
if(isDate(token))
ymd = token;
if(!st.hasMoreTokens())
break;
token = st.nextToken();
if(isTime(token)) {
hms = token;
}
if(!st.hasMoreTokens())
break;
token = st.nextToken();
if(!st.hasMoreTokens())
break;
token = st.nextToken();
/* storage the related fields of process start */
if(getProcessEvtType(token) == START_EVENT) {
event = token;
for(int i = 0; i < eToPoffset; i++) {
if(!st.hasMoreTokens())
break;
token = st.nextToken();
if(i == EVENT_TO_PROCESSID)
sProcessId = getProcessId(token, NEW_ID);
}
token = getProcessName(token);
sProcess = token;
if(!st.hasMoreTokens())
break;
token = st.nextToken();
if(!st.hasMoreTokens())
break;
token = st.nextToken();
sUser = getProcessUser(token);
if(!st.hasMoreTokens())
break;
token = st.nextToken();
sDomain = getProcessDomain(token);
if(!st.hasMoreTokens())
break;
token = st.nextToken();
sLogon = getProcessLogon(token);
Record rec = record.get(sProcess);
if(rec == null) {
rec = new Record(ymd, hms, event, sProcess, sProcessId,
sUser, sDomain, sLogon);
rec.setTime(totalTime(ymd, hms));
record.put(sProcess, rec);
}
else {
setPara(rec, ymd, hms, event, sProcess, sProcessId,
sUser, sDomain, sLogon);
rec.setEvent(event);
record.put(sProcess, rec);
}
}
/* match the related fields */
else if(getProcessEvtType(token) == EXIT_EVENT) {
for(int i = 0; i < eToPoffset; i++) {
if(!st.hasMoreTokens())
break;
token = st.nextToken();
if(i == EVENT_TO_PROCESSID)
sProcessId = getProcessId(token, OLD_ID);
}
token = getProcessName(token);
sProcess = token;
if(!st.hasMoreTokens())
break;
token = st.nextToken();
sUser = getProcessUser(token);
if(!st.hasMoreTokens())
break;
token = st.nextToken();
sDomain = getProcessDomain(token);
if(!st.hasMoreTokens())
break;
token = st.nextToken();
sLogon = getProcessLogon(token);
Record rec = record.get(sProcess);
if(rec != null) {
if(isMatchRecord(rec, ymd, hms, sProcess, sProcessId,
sUser, sDomain, sLogon)) {
Event value = processRun.get(sProcess);
if(value == null) {
value = new Event(sProcess);
value.setCount((int)(totalTime(ymd, hms) - rec.getTime()));
processRun.put(sProcess, value);
}
else {
value.setCount((int)(totalTime(ymd, hms) - rec.getTime()));
processRun.put(sProcess, value);
}
}
}
}
}
line = reader.readLine();
}
} catch(IOException ioe) {
ioe.printStackTrace();
}
}
/*
* obtain process event type
* @param str
* input string
*/
public int getProcessEvtType(String str) {
if(str.equals(startEvt))
return START_EVENT;
else if(str.equals(exitEvt))
return EXIT_EVENT;
else
return 0;
}
/*
* obtain the process Id from the input string
*
* @param str
* input string
*/
public String getProcessId(String str, int id) {
String strPrefix1 = "New Process ID: ";
String strPrefix2 = "Process ID: ";
String st;
if(id == NEW_ID)
st = str.substring(strPrefix1.length());
else
st = str.substring(strPrefix2.length());
return st;
}
/*
* obtain the user name from the input string
*
* @param str
* input string
*/
public String getProcessUser(String str) {
String strPrefix = "User Name: ";
String st;
st = str.substring(strPrefix.length());
return st;
}
/*
* obtain the domain from the input string
*
* @param str
* input string
*/
public String getProcessDomain(String str) {
String strPrefix = "Domain: ";
String st;
st = str.substring(strPrefix.length());
return st;
}
/*
* obtain the logon Id from the input string
*
* @param str
* input string
*/
public String getProcessLogon(String str) {
String strPrefix = "Logon ID: ";
String st;
st = str.substring(strPrefix.length());
return st;
}
/*
* input string is date or not
*/
public boolean isDate(String input) {
if(patternMatch(input, pattern1))
return true;
else
return false;
}
/*
* input string is time or not
*/
public boolean isTime(String input) {
if(patternMatch(input, pattern2))
return true;
else
return false;
}
/*
* date change to seconds
*/
public long DateToS(String s) {
long d = 0;
d += 365*24*60*60*Long.parseLong(s.substring(0, 2));
d += 30*24*60*60*Long.parseLong(s.substring(2,4));
d += 24*60*60*Long.parseLong(s.substring(4,6));
return d;
}
/*
* time change to seconds
*/
public long TimeToS(String s) {
long t = 0;
t += 60*60*Long.parseLong(s.substring(0, 2));
t += 60*Long.parseLong(s.substring(4,5));
t += Long.parseLong(s.substring(7,8));
return t;
}
/*
* total seconds
*/
public long totalTime(String d, String t) {
long tt = 0;
tt = DateToS(d) + TimeToS(t);
return tt;
}
/*
* the time offset process exit and start
*/
public long offsetTime(Record e, Record s) {
long off = 0;
off = totalTime(e.getYymmdd(), e.getHhmmss()) -
totalTime(s.getYymmdd(), e.getHhmmss());
return off;
}
/*
* set parameters for record
*/
public void setPara(Record rec, String d, String t, String e, String p,
String pi, String u, String dm, String l) {
rec.setYymmdd(d);
rec.setHhmmss(t);
rec.setEvent(e);
rec.setSProcess(p);
rec.setSLogonId(pi);
rec.setSUser(u);
rec.setSDomain(dm);
rec.setSLogonId(l);
rec.setTime(totalTime(d, t));
}
/*
* match fields between start record and exit record
*/
public boolean isMatchRecord(Record rec, String d, String t, String p,
String pi, String u, String dm, String l) {
if(rec.getSProcess().equals(p) && rec.getSProcessId().equals(pi) &&
rec.getSUser().equals(u) && rec.getSDomain().equals(dm) &&
rec.getSLogonId().equals(l) && (totalTime(d, t) >= rec.getTime()))
return true;
else
return false;
}
/* (non-Javadoc)
* @see java.lang.Object#toString()
*/
@Override
public String toString() {
StringBuffer strbf = new StringBuffer();
String sEvt = "Process Name";
String sFrq = "Average Run Time";
String s1 = " ";
String s2 = "-";
List<Event> entries = new ArrayList<Event>();
entries.addAll(processRun.values());
Collections.sort(entries, new Event());
strbf.append(sEvt);
for(int i = 0; i < (PRINT_MAX_LENGTH - sEvt.length() - sFrq.length()); i++)
strbf.append(s1);
strbf.append(sFrq).append(NEWLINE);
for(int i = 0; i < PRINT_MAX_LENGTH; i++)
strbf.append(s2);
strbf.append(NEWLINE);
for(Event evt : entries) {
evt.PRINT_MAX_LENGTH = PRINT_MAX_LENGTH;
strbf.append(evt).append(NEWLINE);
}
for(int i = 0; i < PRINT_MAX_LENGTH; i++)
strbf.append(s2);
strbf.append(NEWLINE);
return new String(strbf);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -