Browse Source

增加计算日志

shaohongbo 3 years ago
parent
commit
c1bbeb5619

+ 5 - 22
src/main/java/com/persagy/apm/diagnose/constant/EnumComputeLogType.java

@@ -8,12 +8,12 @@ package com.persagy.apm.diagnose.constant;
  * @since: 2018年8月27日: 下午7:01:08
  * Update By cuixubin 2018年8月27日: 下午7:01:08
  */
-public enum EnumTimeType {
-	MIN15(0, "15分钟"), HOUR(1, "1h"), DAY(2, "1d"), MONTH(3, "1month"), YEAR(4, "1year");
-	
+public enum EnumComputeLogType {
+	ComputeType(0, "计算日志"), SendDataType(1, "发数日志");
+
 	private int code;
 	private String name;
-	
+
 	public int getCode() {
 		return code;
 	}
@@ -21,25 +21,8 @@ public enum EnumTimeType {
 		return name;
 	}
 
-	EnumTimeType(int code, String name) {
+	EnumComputeLogType(int code, String name) {
 		this.code = code;
 		this.name = name;
 	}
-	
-	/**
-	 * Description: 根据编码获取TimeDimension枚举值
-	 * @param code
-	 * @return TimeDimension
-	 * @author JiShaoJun
-	 * @since 2018年8月30日: 下午2:57:17
-	 * Update By JiShaoJun 2018年8月30日: 下午2:57:17
-	 */
-	public static EnumTimeType getTimeDimension(int code) {
-		for(EnumTimeType item : EnumTimeType.values()) {
-			if(item.getCode() == code) {
-				return item;
-			}
-		}
-		return null;
-	}
 }

+ 54 - 43
src/main/java/com/persagy/apm/diagnose/indicatorrecord/service/impl/MonitorIndicatorRecordServiceImpl.java

@@ -6,10 +6,7 @@ import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.persagy.apm.diagnose.config.ComputePropertiesConfig;
 import com.persagy.apm.diagnose.config.RabbitConfig;
-import com.persagy.apm.diagnose.constant.AlarmConstants;
-import com.persagy.apm.diagnose.constant.DiAgnoseConst;
-import com.persagy.apm.diagnose.constant.EnumDataTimeType;
-import com.persagy.apm.diagnose.constant.EnumTimeType;
+import com.persagy.apm.diagnose.constant.*;
 import com.persagy.apm.diagnose.indicatorcompute.model.ProjectIndicatorCompute;
 import com.persagy.apm.diagnose.indicatorcompute.service.IProjectIndicatorComputeService;
 import com.persagy.apm.diagnose.indicatorrecord.model.dto.*;
@@ -26,6 +23,7 @@ import com.persagy.apm.diagnose.utils.*;
 import com.persagy.framework.ems.data.core.enumeration.EMSOrder;
 import com.persagy.framework.ems.data.core.enumeration.SpecialOperator;
 import com.persagy.framework.ems.data.mvc.dao.CoreDao;
+import com.persagy.framework.ems.data.pojo.hbase.IndicatorComputeLog;
 import com.persagy.framework.ems.data.pojo.hbase.MonitorIndicatorRecord;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang.StringUtils;
@@ -119,7 +117,6 @@ public class MonitorIndicatorRecordServiceImpl implements IMonitorIndicatorRecor
                 // 获取不到锁,略过
                 return new AsyncResult<>("【监测指标数据计算线程】项目:" + projectDTO.getProjectId() + "被占用");
             }
-
             long start = System.currentTimeMillis();
             AsyncResult<String> errorMsg = computeProjectIndicatorData(projectDTO, projectIndicatorCompute);
             if (errorMsg != null) {
@@ -138,7 +135,6 @@ public class MonitorIndicatorRecordServiceImpl implements IMonitorIndicatorRecor
 
     private AsyncResult<String> computeProjectIndicatorData(ProjectDTO projectDTO, ProjectIndicatorCompute projectIndicatorCompute) throws Exception {
         //        log.info(Thread.currentThread().getName() + "开始计算[{}]的设备运行诊断监测指标", projectDTO.getProjectId());
-
         //判断当前计算轮次是否大于缓存中最新计算轮次,如果是,则证明已经被计算过,则略过
         if (checkProjectIsCalcd(projectDTO.getProjectId(), projectIndicatorCompute)) {
             return new AsyncResult<>("【监测指标数据计算线程】当前项目:" + projectDTO.getProjectId() + "被占用");
@@ -147,7 +143,6 @@ public class MonitorIndicatorRecordServiceImpl implements IMonitorIndicatorRecor
         //通过报警服务查询报警规则
         // 查询设备运行诊断的报警类型
         List<String> eqdxAlarmItemCodeList = energyAlarmService.queryEqdxAlarmItemCodes();
-
         if (CollectionUtils.isEmpty(eqdxAlarmItemCodeList)) {
             return new AsyncResult<>("【监测指标数据计算线程】未查询到设备运行诊断的报警类型");
         }
@@ -155,51 +150,65 @@ public class MonitorIndicatorRecordServiceImpl implements IMonitorIndicatorRecor
         if (CollectionUtils.isEmpty(projectAlarmRules)) {
             return new AsyncResult<>("【监测指标数据计算线程】当前项目:" + projectDTO.getProjectId() + "未设置报警规则");
         }
-
+        //通过项目报警条件,获取项目下对象id及监控点位id
         Set<String> objIdAndIndicatorId = getObjIdAndInfoCodeFromRules(projectAlarmRules);
-        //        log.debug(Thread.currentThread().getName() + "共有{}个监测指标需要计算", objIdAndIndicatorId.size());
         if (CollectionUtils.isEmpty(objIdAndIndicatorId)) {
             return new AsyncResult<>("【监测指标数据计算线程】当前项目:" + projectDTO.getProjectId() + "报警规则未关联对象");
         }
+
         Map<String, Date> objId_indicatorIdAndComputeTIme = getObjId_IndicatorIdAndComputeTIme(projectDTO);
         Map<String, CalculateMethodDTO> methodIdAndMethodDTO = energyAlarmService.queryCalculateMethods();
 
         for (String objIdIndicatorId : objIdAndIndicatorId) {
-            computeObjIndicatorData(projectDTO, objId_indicatorIdAndComputeTIme.get(objIdIndicatorId), methodIdAndMethodDTO, objIdIndicatorId);
+            Date lastComputeTime =  objId_indicatorIdAndComputeTIme.get(objIdIndicatorId);
+            if (lastComputeTime == null) {
+                lastComputeTime = getDefultStartTime();
+            }
+            try {
+                computeObjIndicatorData(projectDTO,lastComputeTime ,methodIdAndMethodDTO, objIdIndicatorId);
+            }catch (Exception e){
+                IndicatorComputeLog save = new IndicatorComputeLog();
+                save.setLogInfo(e.getMessage());
+                save.setProject(projectDTO.getProjectId());
+                int indexOf = objIdIndicatorId.indexOf("_");
+                String objId = objIdIndicatorId.substring(0, indexOf);
+                String indicatorId = objIdIndicatorId.substring(indexOf + 1);
+                save.setCode(indicatorId);
+                save.setObjId(objId);
+                save.setLogType(EnumComputeLogType.ComputeType.getCode());
+                save.setDataTime(lastComputeTime);
+                save.setComputeRound(projectIndicatorCompute.getComputeRound());
+                save.setLogInfo(CommonUtils.getExceptionStackTrace(e));
+                save.setLogTime(new Date());
+                coredao.save(save);
+            }
         }
         // 更新缓存计算轮次
         updateProjectComputeRound(projectDTO.getProjectId(), projectIndicatorCompute);
         return null;
     }
 
+
     private void computeObjIndicatorData(ProjectDTO projectDTO, Date lastComputeTime, Map<String, CalculateMethodDTO> methodIdAndMethodDTO, String objIdIndicatorId) throws Exception {
         int indexOf = objIdIndicatorId.indexOf("_");
         String objId = objIdIndicatorId.substring(0, indexOf);
         String indicatorId = objIdIndicatorId.substring(indexOf + 1);
         String methodId = energyAlarmService.queryObjIndicatorMethodId(projectDTO.getProjectId(), objId, indicatorId);
         if (StringUtils.isBlank(methodId)) {
-            log.error("【监测指标数据计算线程】:项目监控指标未设置公式:" + projectDTO.getProjectId() + ";" + objId + ";" + indicatorId);
-            return;
+//            log.error("【监测指标数据计算线程】:项目监控指标未设置公式:" + projectDTO.getProjectId() + ";" + objId + ";" + indicatorId);
+            throw new Exception("【监测指标数据计算线程】:项目监控指标未设置公式:" + projectDTO.getProjectId() + ";" + objId + ";" + indicatorId);
         }
         CalculateMethodDTO calculateMethodDTO = methodIdAndMethodDTO.get(methodId);
         if (calculateMethodDTO == null) {
-            log.error("【监测指标数据计算线程】:项目监控指标设置公式为null:" + projectDTO.getProjectId() + ";" + objId + ";" + indicatorId);
-            return;
-        }
-        if (lastComputeTime == null) {
-            lastComputeTime = getDefultStartTime();
+            throw new Exception("【监测指标数据计算线程】:项目监控指标设置公式为null:" + projectDTO.getProjectId() + ";" + objId + ";" + indicatorId);
         }
+
         Date computeEndTime = DateUtils.addDays(lastComputeTime, computePropertiesConfig.getRoundDays());
         String formula = calculateMethodDTO.getFormula();
         if (StringUtils.isBlank(formula)) {
-            log.error("【监测指标数据计算线程】:项目监控指标设置公式为null:" + projectDTO.getProjectId() + ";" + objId + ";" + indicatorId);
-            return;
-        }
-        Date computeTime = computeIndicatorData(projectDTO, objId, lastComputeTime, computeEndTime, indicatorId, formula);
-        if (computeTime == null) {
-            return;
+            throw new Exception("【监测指标数据计算线程】:项目监控指标设置公式为null:" + projectDTO.getProjectId() + ";" + objId + ";" + indicatorId);
         }
-        saveOrUpdateComputeTime(projectDTO.getProjectId(), objId, indicatorId, computeTime);
+        computeIndicatorData(projectDTO, objId, lastComputeTime, computeEndTime, indicatorId, formula);
     }
 
     /**
@@ -251,7 +260,7 @@ public class MonitorIndicatorRecordServiceImpl implements IMonitorIndicatorRecor
      * @param: formula
      * @updateTime 2021/9/25 20:11
      */
-    private Date computeIndicatorData(ProjectDTO projectDTO, String objId, Date lastComputeTime, Date computeEndTime, String infoCode, String formula) throws Exception {
+    private void computeIndicatorData(ProjectDTO projectDTO, String objId, Date lastComputeTime, Date computeEndTime, String infoCode, String formula) throws Exception {
         ComputeCalculateDTO computeCalculateDTO = new ComputeCalculateDTO();
         computeCalculateDTO.setObjId(objId);
         computeCalculateDTO.setProjectId(projectDTO.getProjectId());
@@ -259,20 +268,18 @@ public class MonitorIndicatorRecordServiceImpl implements IMonitorIndicatorRecor
         Map<String, Double> timeDataMap = TimeDataUtil.getTimeDataMap(lastComputeTime, computeEndTime,
                 EnumTimeType.MIN15);
 
-        Date timeEnd = null;
         for (Map.Entry<String, Double> entry : timeDataMap.entrySet()) {
             Date dataTime = DateUtils.str2Date(entry.getKey(), DateUtils.SDF_SECOND);
-            timeEnd = dataTime;
             if (dataTime.getTime() > System.currentTimeMillis()) {
                 break;
             }
             computeCalculateDTO.setDataTime(dataTime);
             Double targetData;
+
             targetData = computeObjTargetDataByCalculate(computeCalculateDTO, formula);
             if (targetData == null) {
                 break;
             }
-
             MonitorIndicatorRecord monitorIndicatorRecord = new MonitorIndicatorRecord();
             monitorIndicatorRecord.setMonitorIndicatorId(infoCode);
             monitorIndicatorRecord.setDataTime(dataTime);
@@ -280,8 +287,9 @@ public class MonitorIndicatorRecordServiceImpl implements IMonitorIndicatorRecor
             monitorIndicatorRecord.setProject(projectDTO.getProjectId());
             monitorIndicatorRecord.setDataValue(targetData);
             saveOrUpdateByPk(monitorIndicatorRecord);
+            saveOrUpdateComputeTime(projectDTO.getProjectId(), objId, infoCode, dataTime);
         }
-        return timeEnd;
+
     }
 
     private Date getDefultStartTime() throws Exception {
@@ -297,7 +305,6 @@ public class MonitorIndicatorRecordServiceImpl implements IMonitorIndicatorRecor
 
 
     private void saveOrUpdateComputeTime(String projectId, String objId, String indicatorId, Date computeTime) {
-
         CalculateTimeRecord update = new CalculateTimeRecord();
         update.setMonitorIndicatorId(indicatorId);
         update.setObjId(objId);
@@ -440,7 +447,6 @@ public class MonitorIndicatorRecordServiceImpl implements IMonitorIndicatorRecor
         if (CollectionUtils.isEmpty(objIdAlarmItemCodeAndInfoCodes) || objIdAlarmItemCodeAndInfoCodes.size() == 0) {
             return;
         }
-        //        log.error("获取到的设备与监测点位映射关系:" + objIdAlarmItemCodeAndInfoCodes);
         for (Map.Entry<String, List<String>> entry : objIdAlarmItemCodeAndInfoCodes.entrySet()) {
             String objIdAndAlarmItemCode = entry.getKey();
             int indexOf = objIdAndAlarmItemCode.indexOf("_");
@@ -448,7 +454,6 @@ public class MonitorIndicatorRecordServiceImpl implements IMonitorIndicatorRecor
             String alarmItemCode = objIdAndAlarmItemCode.substring(indexOf + 1);
             String lockKey = AlarmConstants.alarmDataLockPrefix + objId + "-" + alarmItemCode;
             Object isLock = redisUtil.get(lockKey);
-            //            log.error("是否获取到锁:" + isLock);
             if (null != isLock) {
                 continue;
             }
@@ -481,7 +486,6 @@ public class MonitorIndicatorRecordServiceImpl implements IMonitorIndicatorRecor
             if (sendTimeKeyAndDataList.size() == 0) {
                 continue;
             }
-
             JSONArray sendArray = CollectDataUtil.batchBuildSendJsonParam(sendTimeKeyAndDataList, alarmItemCode);
 
             try {
@@ -492,11 +496,21 @@ public class MonitorIndicatorRecordServiceImpl implements IMonitorIndicatorRecor
                 updateRedisConfigItemSendTimeDTO(projectDTO.getProjectId(), objIdAndAlarmItemCode, configItemSendTimeDTO);
                 // 发数
                 rabbitConfig.sendMsg(sendArray);
+
+                IndicatorComputeLog save = new IndicatorComputeLog();
+                save.setProject(projectDTO.getProjectId());
+                save.setCode(alarmItemCode);
+                save.setObjId(objId);
+                save.setLogType(EnumComputeLogType.SendDataType.getCode());
+                save.setDataTime(endTime);
+                save.setLogInfo(sendArray.toJSONString());
+                save.setLogTime(new Date());
+                coredao.save(save);
             } catch (Exception e) {
                 e.printStackTrace();
                 log.error("指标发送报表服务报错:" + projectDTO.getProjectId() + ";" + CommonUtils.getExceptionStackTrace(e));
             }
-            log.error("指标发送报表服务数据:" + projectDTO.getProjectId() + ";" + sendArray);
+//            log.error("指标发送报表服务数据:" + projectDTO.getProjectId() + ";" + sendArray);
         }
     }
 
@@ -693,6 +707,7 @@ public class MonitorIndicatorRecordServiceImpl implements IMonitorIndicatorRecor
 
     private Double computeObjTargetDataByCalculate(ComputeCalculateDTO computeCalculateDTO, String calculateStr)
             throws Exception {
+
         List<String> variables = CalculateUtil.getVariablesFromFormula(calculateStr);
         Map<String, Double> variableAndData = new HashMap<>(16);
         for (String variable : variables) {
@@ -734,10 +749,9 @@ public class MonitorIndicatorRecordServiceImpl implements IMonitorIndicatorRecor
         }
         BigDecimal result = new ComputeFormulaUtil(calculateStr).getResult();
         if (result == null) {
-            log.error("【监测指标数据计算线程】:解析公式为空,projectId:" + computeCalculateDTO.getProjectId() + "对象id:"
+            throw new Exception("【监测指标数据计算线程】:解析公式为空,projectId:" + computeCalculateDTO.getProjectId() + "对象id:"
                     + computeCalculateDTO.getObjId() + ";指标id:" + computeCalculateDTO.getTargetId()
                     + ";带入公式:" + calculateStr);
-            return null;
         }
         return result.doubleValue();
     }
@@ -783,10 +797,9 @@ public class MonitorIndicatorRecordServiceImpl implements IMonitorIndicatorRecor
                     computeCalculateDTO.getProjectId(), calculateVariableDTO.getComputeObjType(),
                     computeCalculateDTO.getObjId(), null));
             if (CollectionUtils.isEmpty(objList)) {
-                log.error("【指标计算线程】:查询数据中台子对象为空,projectId:" + computeCalculateDTO.getProjectId() + ";objId:"
+                throw new Exception("【指标计算线程】:查询数据中台子对象为空,projectId:" + computeCalculateDTO.getProjectId() + ";objId:"
                         + computeCalculateDTO.getObjId() + ";子对象类型:"
                         + calculateVariableDTO.getComputeObjType());
-                return null;
             }
             List<Double> list = new ArrayList<>();
             for (JSONObject object : objList) {
@@ -840,13 +853,11 @@ public class MonitorIndicatorRecordServiceImpl implements IMonitorIndicatorRecor
         List<Double> arrayList = new ArrayList<>();
         List<JSONObject> objectList = centerDataService.queryObjListByObjId(projectId, Collections.singletonList(objId));
         if (CollectionUtils.isEmpty(objectList)) {
-            log.error("【指标数据计算线程】:查询数据中台对象不存在,:objId:" + objId + ";信息点:" + computeCode);
-            arrayList.add(null);
-            return arrayList;
+           throw new Exception("【指标数据计算线程】:查询数据中台对象不存在,:objId:" + objId + ";信息点:" + computeCode);
         }
         Double double1 = objectList.get(0).getDouble(computeCode);
         if (double1 == null) {
-            log.error("【指标数据计算线程】:查询数据中台对象静态数据为空,:objId:" + objId + ";信息点:" + computeCode);
+            throw new Exception("【指标数据计算线程】:查询数据中台对象静态数据为空,:objId:" + objId + ";信息点:" + computeCode);
         }
         arrayList.add(double1);
         return arrayList;
@@ -862,7 +873,7 @@ public class MonitorIndicatorRecordServiceImpl implements IMonitorIndicatorRecor
             result.add(dataList.get(0).getData());
         }
         if (CollectionUtils.isEmpty(result)) {
-            log.error("【指标计算线程】:查询数据中台对象历史数据为空,projectId:" + projectId + ";objId:" + objId + ";信息点:" + computeCode
+            throw new Exception("【指标计算线程】:查询数据中台对象历史数据为空,projectId:" + projectId + ";objId:" + objId + ";信息点:" + computeCode
                     + ";时间:" + DateUtils.date2Str(startTime, DateUtils.SDF_SECOND) + "_"
                     + DateUtils.date2Str(startTime2, DateUtils.SDF_SECOND));
         }

+ 6 - 1
src/main/java/com/persagy/apm/diagnose/utils/ComputeFormulaUtil.java

@@ -16,6 +16,7 @@ public class ComputeFormulaUtil {
 
 	// 构造器,把公式传进去,比如: 100 + 20 * 5 + (1 + 2)
 	public ComputeFormulaUtil(String val) {
+		val = val.replace("--", "+");
 		this.val = val.toCharArray();
 		len = this.val.length;
 		inx = 0;
@@ -23,6 +24,10 @@ public class ComputeFormulaUtil {
 
 	// 获取计算结果,使用方法其实就是 new Calc("100 + 20 * 5 + (1 + 2)").getResult();就可以得到结果了
 	public BigDecimal getResult() {
+		BigDecimal nextValue = nextValue(BigDecimal.ZERO, '+');
+		if(val!=null&&val[0]=='['&&val[len-1]==']'){
+			return new BigDecimal(0.0-nextValue.doubleValue());
+		}
 		return nextValue(BigDecimal.ZERO, '+');
 	}
 
@@ -103,7 +108,7 @@ public class ComputeFormulaUtil {
 	}
 
 	public static void main(String[] args) {
-		ComputeFormulaUtil computeUtil = new ComputeFormulaUtil("(10-2)/0*0");
+		ComputeFormulaUtil computeUtil = new ComputeFormulaUtil("[0-1]");
 		BigDecimal result = computeUtil.getResult();
 		System.out.println(result);
 	}

+ 32 - 25
src/main/java/com/persagy/framework/ems/data/pojo/hbase/IndicatorComputeLog.java

@@ -1,52 +1,59 @@
 package com.persagy.framework.ems.data.pojo.hbase;
 
-import java.util.Date;
-
 import com.fasterxml.jackson.annotation.JsonProperty;
-import com.persagy.framework.ems.data.core.annotation.Column;
-import com.persagy.framework.ems.data.core.annotation.Dimension;
-import com.persagy.framework.ems.data.core.annotation.Entity;
-import com.persagy.framework.ems.data.core.annotation.Index;
-import com.persagy.framework.ems.data.core.annotation.Table;
-import com.persagy.framework.ems.data.core.annotation.TimePatition;
-import com.persagy.framework.ems.data.core.enumeration.EMSDimension;
+import com.persagy.framework.ems.data.core.annotation.*;
 import com.persagy.framework.ems.data.core.enumeration.Schema;
 import com.persagy.framework.ems.data.core.enumeration.TimePatitionType;
 import com.persagy.framework.ems.data.mvc.pojo.BusinessObject;
 import lombok.Data;
 
-@Entity(name = "MonitorIndicatorRecord")
-@Table(name = "monitor_indicator", comment = "设备运行诊断指标数据", schema = Schema.UDM,
+import java.util.Date;
+
+@Entity(name = "IndicatorComputeLog")
+@Table(name = "indicator_compute_log", comment = "运行诊断计算发数日志", schema = Schema.UDM,
 		indexes = {
-				@Index(columns = { "project", "obj_id", "monitor_indicator_id", "data_time"}, unique = true)
-})
+				@Index(columns = {"project", "obj_id", "code", "log_time"}),
+				@Index(columns = {"project", "obj_id", "code","log_type","log_time"}),
+				@Index(columns = {"project", "obj_id", "code","log_type","data_time"})
+		})
 @Dimension
 @TimePatition(column = "data_time", type = TimePatitionType.month)
 @Data
-public class MonitorIndicatorRecord extends BusinessObject {
+public class IndicatorComputeLog extends BusinessObject {
 
 	private static final long serialVersionUID = 9123470427203487460L;
 
-	@Column(order = 10, name = "project", length = 20, nullable = false, comment = "项目/建筑id")
+	@Column(order = 10, name = "project", length = 50, nullable = false, comment = "项目/建筑id")
 	@JsonProperty("project")
 	private String project;
-	
+
 	@Column(order = 20, name = "obj_id", length = 50, nullable = true, comment = "能耗模型id")
 	@JsonProperty("objId")
 	private String objId;
-	
-	@Column(order = 30, name = "monitor_indicator_id", length = 50, nullable = true, comment = "分项id")
-	@JsonProperty("monitorIndicatorId")
-	private String monitorIndicatorId;
 
+	@Column(order = 30, name = "code", length = 50, nullable = true, comment = "分项id")
+	@JsonProperty("code")
+	private String code;
 
-	@Column(order = 40, name = "data_time", length = 0, nullable = false, comment = "数据时间")
+	@Column(order = 40, name = "log_time", length = 0, nullable = false, comment = "数据时间")
+	@JsonProperty("logTime")
+	private Date logTime;
+
+
+	@Column(order = 50, name = "log_type", length = 1, nullable = false, comment = "0计算日志,1发数日志")
+	@JsonProperty("logType")
+	private Integer logType;
+
+
+	@Column(order = 60, name = "data_time", length = 0, nullable = false, comment = "数据时间")
 	@JsonProperty("dataTime")
 	private Date dataTime;
 
-	@Column(order = 50, name = "data_value", length = 28, scale = 8, nullable = false, comment = "数据值")
-	@JsonProperty("dataValue")
-	private Double dataValue;
-
+	@Column(order = 70, name = "compute_round", length = 128, nullable = true, comment = "计算论次")
+	@JsonProperty("computeRound")
+	private Integer computeRound;
 
+	@Column(order = 80, name = "log_info", length = 128, nullable = false, comment = "日志详情")
+	@JsonProperty("logInfo")
+	private String logInfo;
 }