您的位置:首页 > 其它

tasks:获取日志输出时间并进行排序

2017-09-14 16:18 106 查看

完成时间

2017/9/14

需求:

日志输出信息:

13:32:43.2766 Info {"message":"Notepad_AddLogmessage execution started","level":"Information","timeStamp":"2017-09-07T13:32:43.275643+08:00","windowsIdentity":"ASIAPACIFIC\\sulinf","processName":"Notepad_AddLogmessage","processVersion":"1.0.6459.24021","fileName":"Main","jobId":"ebe1e6f0-dbd4-4e4b-a282-e1fc46aec3d4","robotName":"ASIAPACIFIC\\SULINF"}

13:32:45.0568 Info {"message":"This is  additional massage","level":"Information","timeStamp":"2017-09-07T13:32:45.0568211+08:00","windowsIdentity":"ASIAPACIFIC\\sulinf","processName":"Notepad_AddLogmessage","processVersion":"1.0.6459.24021","fileName":"Main","jobId":"ebe1e6f0-dbd4-4e4b-a282-e1fc46aec3d4","robotName":"ASIAPACIFIC\\SULINF","Name_1":"open application","Type_1":123,"Name_2":"click button","Type_2":true}

13:32:45.7388 Info {"message":"Notepad_AddLogmessage execution ended","level":"Information","timeStamp":"2017-09-07T13:32:45.7408895+08:00","windowsIdentity":"ASIAPACIFIC\\sulinf","processName":"Notepad_AddLogmessage","processVersion":"1.0.6459.24021","fileName":"Main","jobId":"ebe1e6f0-dbd4-4e4b-a282-e1fc46aec3d4","robotName":"ASIAPACIFIC\\SULINF","totalExecutionTimeInSeconds":2,"totalExecutionTime":"00:00:02","Name_1":"open application","Type_1":123,"Name_2":"click button","Type_2":true}


背景分析:

这种日志的输出只是在后台显示。

1. 在message=Notepad_AddLogmessage execution started和message=Notepad_AddLogmessage execution ended之间的log条数是不确定的

2. message=Notepad_AddLogmessage execution started和message=Notepad_AddLogmessage execution ended的时间顺序不是升序或者降序排列的,时间输出是混乱的


要求:从后台输出的日志不允许在前台页面显示,而前台页面的日志输出也不需要这些字段

前台页面的展示log字段如下:

{

“Doc_ID”: “document to be processed”,

“Lvl_1_Event_Name”: “event name”,

“Lvl_2_Event_Name”: “event breakdown”,

“Start_Date”: “2017-09-11”,

“Start_Time”: “08:15:26:632”,

“End_Date”: “2017-09-11”,

“End_Time”: “08:15:27:178”,

“Discrepancy”: “error message”,

“User_ID”: “robot name”,

“message”: “runtime message for FE display”

}

2. 其中Start_Date 和 Start_Time 对应上面日志输出message=XXXstarted中的timeStamp字段,同样End_Date 和 End_Time 也是对应message=xxxended中的timeStamp

3. 其他字段的输出可以来自message=xxxstarted或者message=xxxended中

思路分析:

1. Start_Date 和 Start_Time 对应上面日志输出message=XXXstarted中的timeStamp字段,所以可以在定义timeStamp字段的类中定义属性Start_Date 和 Start_Time,使得时间始终同步

2. 前台页面只展示以上9个字段,那么只需要获取以上9个字段

3. 对后台输出的日志按timeStamp字段先排序

4. 获取started和ended的时间

4.1 判断不存在meaaage时 return时,return;

4.2 判断存在message,但是不存在start和end

4.3 查找含有started 和 ended的model,并获取时间。

4.3.1 获取含有start的时间和信息

4.3.2 获取含有end的时间和信息

5. 合并获取的start和end时间

核心代码块

LogParser.java 核心逻辑

public class LogParser {
private static final Logger logger = LoggerFactory.getLogger(LogParser.class);

public List<EventLog>  parse(List<LogModel> logs) {

// 第一:对logs进行升序排序
ValueComparator vc = new ValueComparator();
Collections.sort(logs,vc);
for (LogModel lm:logs) {
System.out.println(lm.getMessage());
}

// 第二: 获取start和end时间
List<EventLog> eventLogs = new ArrayList<>();
Map<String,String> logsFields = new HashMap<String,String>();

for (int i = 0;i <logs.size();i++){
//判断不存在meaaage时 return;
if(logs.get(i).getMessage() == null || logs.get(i).getMessage().equals("")){
continue;
}

//查找含有started 和 ended的model,并获取时间。
logsFields.put("message",logs.get(i).getMessage());

//判断存在message,但是不存在start和end时,return
if((logsFields.get("message").indexOf("ended")) < 0 && (logsFields.get("message").indexOf("started")) < 0){
continue;
}

//获取含有start的时间和信息
if((logsFields.get("message").indexOf("started")) >= 0){
EventLog eventLog = new EventLog();
eventLog.setDoc_ID(logs.get(i).getDoc_ID());
eventLog.setLvl_1_Event_Name(logs.get(i).getLvl_1_Event_Name());
eventLog.setLvl_2_Event_Name(logs.get(i).getLvl_2_Event_Name());
eventLog.setStart_Date(logs.get(i).getStart_Date());
eventLog.setStart_Time(logs.get(i).getStart_Time());
eventLog.setEnd_Date(logs.get(i).getEnd_Date());
eventLog.setEnd_Time(logs.get(i).getEnd_Time());
eventLog.setDiscrepancy(logs.get(i).getDiscrepancy());
eventLog.setUser_ID(logs.get(i).getUser_ID());
eventLog.setMessage(logs.get(i).getMessage());
eventLogs.add(eventLog);
}

//获取含有end的时间和信息
if((logsFields.get("message").indexOf("ended")) >= 0){
EventLog eventLog = new EventLog();
eventLog.setDoc_ID(logs.get(i).getDoc_ID());
eventLog.setLvl_1_Event_Name(logs.get(i).getLvl_1_Event_Name());
eventLog.setLvl_2_Event_Name(logs.get(i).getLvl_2_Event_Name());
eventLog.setStart_Date(logs.get(i).getStart_Date());
eventLog.setStart_Time(logs.get(i).getStart_Time());
eventLog.setEnd_Date(logs.get(i).getEnd_Date());
eventLog.setEnd_Time(logs.get(i).getEnd_Time());
eventLog.setDiscrepancy(logs.get(i).getDiscrepancy());
eventLog.setUser_ID(logs.get(i).getUser_ID());
eventLog.setMessage(logs.get(i).getMessage());
eventLogs.add(eventLog);
}
}

// last: merge start time and end time
int length = eventLogs.size();
// 声明el以防和eventLogs崇明导致的错误。
List<EventLog> eL = new ArrayList<>();
for (int j = 0; j < length; j++){

if(j % 2 != 1){
continue;
}

int i = j-1;

EventLog eventLog = new EventLog();
eventLog.setDoc_ID(eventLogs.get(i).getDoc_ID());
eventLog.setEnd_Date(eventLogs.get(j).getEnd_Date());
eventLog.setEnd_Time( eventLogs.get(j).getEnd_Time());
eventLog.setLvl_1_Event_Name(eventLogs.get(i).getLvl_1_Event_Name());
eventLog.setLvl_2_Event_Name(eventLogs.get(i).getLvl_2_Event_Name());
eventLog.setStart_Date(eventLogs.get(i).getStart_Date());
eventLog.setStart_Time(eventLogs.get(i).getStart_Time());
eventLog.setDiscrepancy(eventLogs.get(i).getDiscrepancy());
eventLog.setUser_ID(eventLogs.get(i).getUser_ID());
eventLog.setMessage(eventLogs.get(i).getMessage());

eL.add(eventLog);
}

return eL;
}

}


LogModel.java

package com.dxc.leap.raas.uipath.wrapper.model;

import com.dxc.leap.raas.common.EUiPathLogLevel;
import com.fasterxml.jackson.annotation.JsonProperty;

import java.time.Instant;
import java.util.Comparator;
import java.util.Date;

/**
* @author wenda.hu@hpe.com
*/
public class LogModel{
@JsonProperty
private EUiPathLogLevel Level;

@JsonProperty
private String WindowsIdentity;

@JsonProperty
private String ProcessName;

@JsonProperty
private Date TimeStamp;

@JsonProperty
private String Message;

@JsonProperty
private String JobKey;

@JsonProperty
private String RawMessage;

@JsonProperty
private int Id;

@JsonProperty
private String RobotName;

private String Doc_ID;

private String Lvl_1_Event_Name;

private String Lvl_2_Event_Name;

private Date Start_Date;

private Date Start_Time;

private Date End_Date;

private Date End_Time;

private String Discrepancy;

private String User_ID;
省略set/get...
}


ValueComparator.java

public class ValueComparator implements Comparator{
@Override
public int compare(Object o1, Object o2) {
LogModel log1 = (LogModel)o1;
LogModel log2 = (LogModel)o2;
return log1.getTimeStamp().compareTo(log2.getTimeStamp());
}
}


EventLog.java

package com.dxc.leap.raas.uipath.orchestrator.model;

import com.dxc.leap.raas.common.EUiPathLogLevel;

import java.util.Date;

/**
* @author wenda.hu@hpe.com
*/
public class EventLog implements Comparable<EventLog>{

private String Doc_ID;

private String Lvl_1_Event_Name;

private String Lvl_2_Event_Name;

private Date Start_Date;

private Date Start_Time;

private Date End_Date;

private Date End_Time;

private String Discrepancy;

private String User_ID;

private String message;

public EventLog(String doc_ID, String lvl_1_Event_Name, String lvl_2_Event_Name, Date start_Date, Date start_Time,String discrepancy, String user_ID, String message) {
Doc_ID = doc_ID;
Lvl_1_Event_Name = lvl_1_Event_Name;
Lvl_2_Event_Name = lvl_2_Event_Name;
Start_Date = start_Date;
Start_Time = start_Time;
Discrepancy = discrepancy;
User_ID = user_ID;
this.message = message;
}

public EventLog(Date end_Date, Date end_Time) {
End_Date = end_Date;
End_Time = end_Time;
}

public EventLog(String doc_ID, String lvl_1_Event_Name, String lvl_2_Event_Name, Date start_Date, Date start_Time, Date end_Date, Date end_Time, String discrepancy, String user_ID, String message) {
Doc_ID = doc_ID;
Lvl_1_Event_Name = lvl_1_Event_Name;
Lvl_2_Event_Name = lvl_2_Event_Name;
Start_Date = start_Date;
Start_Time = start_Time;
End_Date = end_Date;
End_Time = end_Time;
Discrepancy = discrepancy;
User_ID = user_ID;
this.message = message;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  task