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; } }
相关文章推荐
- C# 获取文件根据创建时间进行排序
- 用Python读取指定文件夹下的所有Landsat影像,并根据影像获取时间对文件名进行排序
- 如何按最后修改时间对 ls 命令的输出进行排序
- 对获取的文件根据修改的时间进行排序
- java 使用logback进行日志输出
- 一道看上去很吓人的算法面试题:如何对n个数进行排序,要求时间复杂度O(n),空间复杂度O(1)
- day03_从键盘输入3个数,进行排序并从大到小输出
- 使用log4j进行日志控制输出
- 利用冒泡排序的思想对符合格式的时间字符串进行排序
- leetcode 刷题-题目3: NlgN时间对单链表进行排序
- 在coreData里 按时间给对象进行排序
- 获取系统当前时间,完成格式化,得到一个字符串。例如”201608130743”(指年月日时分)。再随机取3个小于10的整数,分别插入到 字符串的年、月、日后面,完成输出。
- 一个奇特的脚本输出日志方式-----记录时间方式
- ls按时间排序输出文件列表
- JAVA-从题目看算法,将输入字符串进行排序并输出
- jQuery对JSON数据进行排序输出的方法
- C++获取时间 场景写日志
- Java学习-046-日志抓取合并后排序问题解决方案之 --- log4j 二次定制,实现日志输出添加延时10ms
- Delphi 获取系统时间后格式化输出
- c 获取当前时间并格式化输出