Ver código fonte

增加运行日志和报警推送日志

menglu 3 anos atrás
pai
commit
e2bd9769d8

+ 1 - 1
ibms-data-sdk/pom.xml

@@ -214,7 +214,7 @@
 		<dependency>
 			<groupId>com.persagy</groupId>
 			<artifactId>sailfish</artifactId>
-			<version>0.0.33</version>
+			<version>0.0.34</version>
 		</dependency>
 	</dependencies>
 

+ 14 - 4
ibms-data-sdk/src/main/java/com/persagy/ibms/data/sdk/service/DaemonThread.java

@@ -2,6 +2,7 @@ package com.persagy.ibms.data.sdk.service;
 
 import java.io.File;
 import java.net.URI;
+import java.util.Date;
 import java.util.List;
 import java.util.concurrent.CopyOnWriteArrayList;
 
@@ -10,10 +11,12 @@ import javax.annotation.PostConstruct;
 import org.springframework.stereotype.Component;
 
 import com.persagy.ibms.core.util.KeywordUtil;
+import com.persagy.ibms.core.util.LogUtil;
 import com.persagy.ibms.core.util.RepositoryComputeThread;
 import com.persagy.ibms.data.sdk.test.CheckTest;
 import com.persagy.ibms.data.sdk.util.Constant;
 import com.persagy.ibms.data.sdk.util.DeamonUtil;
+import com.persagy.ibms.data.sdk.util.LogOfRun;
 import com.persagy.ibms.data.sdk.util.RWDLoadUtil;
 import com.persagy.ibms.data.sdk.util.RWDRepositoryUtil;
 import com.persagy.ibms.data.sdk.util.RepositoryContainer;
@@ -134,13 +137,15 @@ public class DaemonThread extends Thread {
 				continue;
 			}
 
-			log.warn("config: " + tmp_config);
-			log.warn("physical_world: " + tmp_physical_world);
+			LogOfRun LogOfRun = new LogOfRun();
+			RepositoryContainer.RepositoryProject.AddLogOfRun(LogOfRun);
+			LogOfRun.setTime("config", null, tmp_config);
+			LogOfRun.setTime("physical_world", null, tmp_physical_world);
 			if (Constant.zkt_physical_world_enable) {
-				log.warn("zkt_physical_world: " + tmp_zkt_physical_world);
+				LogOfRun.setTime("zkt_physical_world", null, tmp_zkt_physical_world);
 			}
 			if (Constant.ibms_physical_world_enable) {
-				log.warn("ibms_physical_world: " + tmp_ibms_physical_world);
+				LogOfRun.setTime("ibms_physical_world", null, tmp_ibms_physical_world);
 			}
 			try {
 				RepositoryImpl Repository = new RepositoryImpl(RepositoryContainer.RepositoryProject, Constant.use_thread, Constant.enable_factor,
@@ -181,9 +186,14 @@ public class DaemonThread extends Thread {
 					// log.info("连接成功");
 					Thread.sleep(1000L);
 				}
+				LogOfRun.status = "success";
 			} catch (Exception e) {
+				String message = LogUtil.GetExceptionStackTrace(e);
 				log.error(e.getMessage(), e);
+				LogOfRun.error(null, message);
+				LogOfRun.status = "failure";
 			}
+			LogOfRun.endTime = new Date();
 
 			if (DaemonThread.initialized) {
 				break;

+ 21 - 0
ibms-data-sdk/src/main/java/com/persagy/ibms/data/sdk/service/RefreshThread.java

@@ -1,10 +1,14 @@
 package com.persagy.ibms.data.sdk.service;
 
+import java.util.Date;
+
 import javax.annotation.PostConstruct;
 
 import org.springframework.stereotype.Component;
 
+import com.persagy.ibms.core.util.LogUtil;
 import com.persagy.ibms.data.sdk.util.Constant;
+import com.persagy.ibms.data.sdk.util.LogOfRun;
 import com.persagy.ibms.data.sdk.util.RWDRepositoryUtil;
 import com.persagy.ibms.data.sdk.util.RepositoryContainer;
 import com.persagy.ibms.data.sdk.util.RepositoryImpl;
@@ -117,6 +121,18 @@ public class RefreshThread extends Thread {
 					log.error(e.getMessage(), e);
 				}
 
+				LogOfRun LogOfRun = new LogOfRun();
+				RepositoryContainer.RepositoryProject.AddLogOfRun(LogOfRun);
+				LogOfRun.setTime("config", changed_config ? DaemonThread.path_config : null, tmp_config);
+				LogOfRun.setTime("physical_world", changed_physical_world ? DaemonThread.path_physical_world : null, tmp_physical_world);
+				if (Constant.zkt_physical_world_enable) {
+					LogOfRun.setTime("zkt_physical_world", changed_zkt_physical_world ? DaemonThread.path_zkt_physical_world : null,
+							tmp_zkt_physical_world);
+				}
+				if (Constant.ibms_physical_world_enable) {
+					LogOfRun.setTime("ibms_physical_world", changed_ibms_physical_world ? DaemonThread.path_ibms_physical_world : null,
+							tmp_ibms_physical_world);
+				}
 				try {
 					log.warn("recompute begin");
 					RepositoryImpl Repository = new RepositoryImpl(RepositoryContainer.RepositoryProject, Constant.use_thread, Constant.enable_factor,
@@ -139,9 +155,14 @@ public class RefreshThread extends Thread {
 					DaemonThread.path_physical_world = this.path_physical_world;
 					DaemonThread.path_zkt_physical_world = this.path_zkt_physical_world;
 					DaemonThread.path_ibms_physical_world = this.path_ibms_physical_world;
+					LogOfRun.status = "success";
 				} catch (Exception e) {
+					String message = LogUtil.GetExceptionStackTrace(e);
 					log.error(e.getMessage(), e);
+					LogOfRun.error(null, message);
+					LogOfRun.status = "failure";
 				}
+				LogOfRun.endTime = new Date();
 			}
 		}
 	}

+ 32 - 0
ibms-data-sdk/src/main/java/com/persagy/ibms/data/sdk/service/rest/BaseApi.java

@@ -21,6 +21,7 @@ import com.persagy.ibms.core.util.CheckUtil;
 import com.persagy.ibms.data.sdk.service.websocket.server.WebSocketChannelInfo;
 import com.persagy.ibms.data.sdk.service.websocket.server.WebSocketChannelPool;
 import com.persagy.ibms.data.sdk.service.websocket.server.WebSocketUtil;
+import com.persagy.ibms.data.sdk.util.LogOfRun;
 import com.persagy.ibms.data.sdk.util.RepositoryContainer;
 import com.persagy.ibms.data.sdk.util.ToolUtil;
 import com.persagy.ibms.data.sdk.websocket.AlarmWebSocketClient;
@@ -138,4 +139,35 @@ public class BaseApi {
 		}
 		return JSONObject.toJSONString(result, SerializerFeature.WriteMapNullValue);
 	}
+
+	@GetMapping(path = "/LogOfRun", produces = "application/json;charset=UTF-8")
+	public JSONObject LogOfRun() {
+		JSONObject result = null;
+		if (RepositoryContainer.RepositoryProject.logOfRun != null) {
+			result = RepositoryContainer.RepositoryProject.logOfRun.toJSON();
+		}
+		return result;
+	}
+
+	@GetMapping(path = "/LogOfRunList", produces = "application/json;charset=UTF-8")
+	public JSONArray LogOfRunList() {
+		JSONArray result = new JSONArray();
+		for (LogOfRun LogOfRun : RepositoryContainer.RepositoryProject.logOfRunList) {
+			result.add(LogOfRun.toJSON());
+		}
+		return result;
+	}
+
+	@GetMapping(path = "/LogOfAlarmList/{param}", produces = "application/json;charset=UTF-8")
+	public JSONArray LogOfAlarmList(@PathVariable("param") int count) {
+		JSONArray result = new JSONArray();
+		if (count == 0) {
+			count = Integer.MAX_VALUE;
+		}
+		for (int i = 0; i < count && i < RepositoryContainer.RepositoryProject.logOfAlarmList.size() - 1; i++) {
+			JSONObject LogOfRun = RepositoryContainer.RepositoryProject.logOfAlarmList.get(i);
+			result.add(LogOfRun);
+		}
+		return result;
+	}
 }

+ 5 - 0
ibms-data-sdk/src/main/java/com/persagy/ibms/data/sdk/util/LogOfDownload.java

@@ -0,0 +1,5 @@
+package com.persagy.ibms.data.sdk.util;
+
+public class LogOfDownload {
+
+}

+ 111 - 0
ibms-data-sdk/src/main/java/com/persagy/ibms/data/sdk/util/LogOfRun.java

@@ -0,0 +1,111 @@
+package com.persagy.ibms.data.sdk.util;
+
+import java.text.SimpleDateFormat;
+import java.util.Arrays;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.CopyOnWriteArrayList;
+
+import com.alibaba.fastjson.JSONObject;
+
+import cn.hutool.json.JSONArray;
+import lombok.extern.slf4j.Slf4j;
+
+@Slf4j
+public class LogOfRun {
+	private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+
+	public Date startTime;
+	public Date endTime;
+	public Map<String, String> contentTime = new ConcurrentHashMap<String, String>();
+	public Map<String, String> contentTimeLast = new ConcurrentHashMap<String, String>();
+	public int step_count;
+	public List<JSONObject> stepList = new CopyOnWriteArrayList<JSONObject>();
+	public List<JSONObject> errorList = new CopyOnWriteArrayList<JSONObject>();
+	public String status;// running,success,failure
+
+	public LogOfRun() {
+		this.startTime = new Date();
+	}
+
+	public synchronized void setTime(String name, String oldTime, String newTime) {
+		log.warn(name + ": " + (oldTime == null ? "" : oldTime + " -> ") + newTime);
+		if (oldTime != null) {
+			this.contentTimeLast.put(name, oldTime);
+		}
+		this.contentTime.put(name, newTime);
+	}
+
+	public synchronized void error(String path, String message) {
+		JSONObject item = new JSONObject();
+		item.put("path", path);
+		item.put("message", message);
+		if (this.errorList.size() <= 1024) {
+			this.errorList.add(item);
+		}
+	}
+
+	public synchronized JSONObject toJSON() {
+		JSONObject result = new JSONObject();
+		if (startTime != null) {
+			result.put("startTime", sdf.format(startTime));
+		}
+		String[] keys = contentTime.keySet().toArray(new String[0]);
+		Arrays.sort(keys);
+		JSONObject content = new JSONObject();
+		for (String key : keys) {
+			String time = (contentTimeLast.containsKey(key) ? contentTimeLast.get(key) + " -> " : "") + contentTime.get(key);
+			content.put(key, time);
+		}
+		result.put("content", content);
+		if (this.step_count > 0) {
+			result.put("step_count", step_count);
+		}
+		{
+			JSONArray stepArray = new JSONArray();
+			for (JSONObject step : stepList) {
+				stepArray.add(step);
+			}
+			result.put("stepArray", stepArray);
+		}
+		{
+			JSONArray errorArray = new JSONArray();
+			for (JSONObject error : errorList) {
+				errorArray.add(error);
+			}
+			result.put("errorArray", errorArray);
+		}
+		if (endTime != null) {
+			result.put("endTime", sdf.format(endTime));
+		}
+		if (status != null) {
+			result.put("status", status);
+		}
+		return result;
+	}
+
+	@Override
+	public synchronized String toString() {
+		StringBuffer sb = new StringBuffer();
+		if (startTime != null) {
+			sb.append("startTime: " + sdf.format(startTime));
+		}
+		String[] keys = contentTime.keySet().toArray(new String[0]);
+		Arrays.sort(keys);
+		for (String key : keys) {
+			sb.append("<BR>");
+			sb.append(key + ": " + (contentTimeLast.containsKey(key) ? contentTimeLast.get(key) + " -> " : "") + contentTime.get(key));
+		}
+		if (endTime != null) {
+			sb.append("<BR>");
+			sb.append("endTime: " + sdf.format(endTime));
+		}
+		if (status != null) {
+			sb.append("<BR>");
+			sb.append("status: " + status);
+		}
+		return sb.toString();
+	}
+}

+ 2 - 2
ibms-data-sdk/src/main/java/com/persagy/ibms/data/sdk/util/RWDAlarmUtil.java

@@ -262,14 +262,14 @@ public class RWDAlarmUtil {
 		if (!alarm.containsKey("floorId")) {
 			String objId = (String) alarm.get("objId");
 			SceneDataObject sdo = RepositoryContainer.instance.id2sdv.get(objId);
-			{
+			if (sdo != null) {
 				SceneDataValue floor = sdo.get("所在楼层-id");
 				if (floor != null && floor.value_prim != null && floor.value_prim.value != null && floor.value_prim.value instanceof String) {
 					String floorString = (String) floor.value_prim.value;
 					alarm.put("floorId", floorString);
 				}
 			}
-			{
+			if (sdo != null) {
 				SceneDataValue floor = sdo.get("所属楼层-id");
 				if (floor != null && floor.value_prim != null && floor.value_prim.value != null && floor.value_prim.value instanceof String) {
 					String floorString = (String) floor.value_prim.value;

+ 33 - 8
ibms-data-sdk/src/main/java/com/persagy/ibms/data/sdk/util/RepositoryImpl.java

@@ -278,15 +278,15 @@ public class RepositoryImpl extends RepositoryBase {
 		int affect_count = 0;
 		// 加入计算队列
 		if (this.enable_factor) {
-			for (String point : RepositoryContainer.RepositoryProject.point2sdv.keySet()) {
-				SceneDataValue sdv = RepositoryContainer.RepositoryProject.point2sdv.get(point);
+			for (String point : this.RepositoryProject.point2sdv.keySet()) {
+				SceneDataValue sdv = this.RepositoryProject.point2sdv.get(point);
 				if (sdv.value_prim.value != null) {
 					item_count++;
 					affect_count += this.ProcessIOT(point);
 				}
 			}
-			for (String point : RepositoryContainer.RepositoryProject.set2sdv.keySet()) {
-				SceneDataValue sdv = RepositoryContainer.RepositoryProject.set2sdv.get(point);
+			for (String point : this.RepositoryProject.set2sdv.keySet()) {
+				SceneDataValue sdv = this.RepositoryProject.set2sdv.get(point);
 				if (sdv.value_prim.value != null) {
 					item_count++;
 					affect_count += this.ProcessIOT(point);
@@ -306,13 +306,13 @@ public class RepositoryImpl extends RepositoryBase {
 		if (this.enable_factor) {
 			item_count++;
 			affect_count += this.addWaitCompute(this.RepositoryProject.alarmArray);
-			for (String objId : RepositoryContainer.RepositoryProject.id2alarmList.keySet()) {
-				SceneDataValue alarmList = RepositoryContainer.RepositoryProject.id2alarmList.get(objId);
+			for (String objId : this.RepositoryProject.id2alarmList.keySet()) {
+				SceneDataValue alarmList = this.RepositoryProject.id2alarmList.get(objId);
 				item_count++;
 				affect_count += this.addWaitCompute(alarmList);
 			}
-			for (String objId : RepositoryContainer.RepositoryProject.id2alarmCount.keySet()) {
-				SceneDataValue alarmCount = RepositoryContainer.RepositoryProject.id2alarmCount.get(objId);
+			for (String objId : this.RepositoryProject.id2alarmCount.keySet()) {
+				SceneDataValue alarmCount = this.RepositoryProject.id2alarmCount.get(objId);
 				item_count++;
 				affect_count += this.addWaitCompute(alarmCount);
 			}
@@ -345,7 +345,32 @@ public class RepositoryImpl extends RepositoryBase {
 		return add_count;
 	}
 
+	@Override
 	public void ComputeOccur(SceneDataValue sdv) {
 		WebSocketUtil.ProcessComputeOccur(sdv);
 	}
+
+	@Override
+	public void log_step_count(int step_count) {
+		this.RepositoryProject.logOfRun.step_count = step_count;
+	}
+
+	@Override
+	public void log_step_begin(int step, int property_count, int value_count) {
+		JSONObject stepJSON = new JSONObject();
+		stepJSON.put("property_count", property_count);
+		stepJSON.put("value_count", value_count);
+		this.RepositoryProject.logOfRun.stepList.add(stepJSON);
+	}
+
+	@Override
+	public void log_step_end(int step, int finish_count) {
+		JSONObject stepJSON = this.RepositoryProject.logOfRun.stepList.get(this.RepositoryProject.logOfRun.stepList.size() - 1);
+		stepJSON.put("finish_count", finish_count);
+	}
+
+	@Override
+	public void log_error(String path, String message) {
+		this.RepositoryProject.logOfRun.error(path, message);
+	}
 }

+ 21 - 0
ibms-data-sdk/src/main/java/com/persagy/ibms/data/sdk/util/RepositoryProject.java

@@ -3,6 +3,7 @@ package com.persagy.ibms.data.sdk.util;
 import java.util.Date;
 import java.util.List;
 import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.CopyOnWriteArrayList;
 
 import com.alibaba.fastjson.JSONObject;
 import com.persagy.ibms.core.data.SceneDataObject;
@@ -30,4 +31,24 @@ public class RepositoryProject {
 
 	// 限流用
 	public ConcurrentHashMap<String, ConcurrentHashMap<String, Date>> ip2param2time = new ConcurrentHashMap<String, ConcurrentHashMap<String, Date>>();
+
+	public LogOfRun logOfRun;
+	public List<LogOfRun> logOfRunList = new CopyOnWriteArrayList<LogOfRun>();
+
+	public List<JSONObject> logOfAlarmList = new CopyOnWriteArrayList<JSONObject>();
+
+	public void AddLogOfRun(LogOfRun LogOfRun) {
+		this.logOfRun = LogOfRun;
+		this.logOfRunList.add(0, LogOfRun);
+		for (int i = this.logOfRunList.size() - 1; i > 1024; i--) {
+			this.logOfRunList.remove(i);
+		}
+	}
+
+	public void AddLogOfAlarm(JSONObject LogOfRun) {
+		this.logOfAlarmList.add(0, LogOfRun);
+		for (int i = this.logOfAlarmList.size() - 1; i > 1024; i--) {
+			this.logOfAlarmList.remove(i);
+		}
+	}
 }

+ 2 - 0
ibms-data-sdk/src/main/java/com/persagy/ibms/data/sdk/websocket/AlarmWebSocketClient.java

@@ -9,6 +9,7 @@ import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
 import com.persagy.ibms.core.util.LogUtil;
 import com.persagy.ibms.data.sdk.util.RWDAlarmUtil;
+import com.persagy.ibms.data.sdk.util.RepositoryContainer;
 
 import lombok.extern.slf4j.Slf4j;
 
@@ -56,6 +57,7 @@ public class AlarmWebSocketClient extends WebSocketClient {
 			String message = arg0;
 			log.debug("AlarmWebSocketClient: " + message);
 			JSONObject alarm = (JSONObject) JSON.parse(message);
+			RepositoryContainer.RepositoryProject.AddLogOfAlarm(alarm);
 			int pushType = (Integer) alarm.get("pushType");
 			if (pushType == 3) {
 				String alarmId = (String) alarm.get("alarmId");