diff --git a/src/main/java/com/nis/domain/log/NtcSslRecordLog.java b/src/main/java/com/nis/domain/log/NtcSslRecordLog.java new file mode 100644 index 000000000..b550ff442 --- /dev/null +++ b/src/main/java/com/nis/domain/log/NtcSslRecordLog.java @@ -0,0 +1,131 @@ +package com.nis.domain.log; + +import com.nis.util.excel.ExcelField; + +public class NtcSslRecordLog extends BaseLogEntity { + + private static final long serialVersionUID = 533266057780162781L; + + // @ExcelField(title = "log_id", sort = 8) + private String logId; + + @ExcelField(title = "version", sort = 8) + private String version;// 版本号 + + @ExcelField(title = "SNI", sort = 9) + private String sni;// SNI + + @ExcelField(title = "SAN", sort = 10) + private String san;// SAN + + @ExcelField(title = "CN", sort = 11) + private String cn;// CN + + // @ExcelField(title = "individual_cert_file", sort = 12) + private String individualCertFile; + + // @ExcelField(title = "middle_cert_file", sort = 13) + private String middleCertFile; + + // @ExcelField(title = "root_cert_file", sort = 14) + private String rootCertFile; + + // @ExcelField(title = "chain_cert_file", sort = 15) + private String chainCertFile; + + public String getLogId() { + return logId; + } + + public void setLogId(String logId) { + this.logId = logId; + } + + public String getVersion() { + return version; + } + + public void setVersion(String version) { + this.version = version; + } + + public String getSni() { + return sni; + } + + public void setSni(String sni) { + this.sni = sni; + } + + public String getSan() { + return san; + } + + public void setSan(String san) { + this.san = san; + } + + public String getCn() { + return cn; + } + + public void setCn(String cn) { + this.cn = cn; + } + + public String getIndividualCertFile() { + return individualCertFile; + } + + public void setIndividualCertFile(String individualCertFile) { + this.individualCertFile = individualCertFile; + } + + public String getMiddleCertFile() { + return middleCertFile; + } + + public void setMiddleCertFile(String middleCertFile) { + this.middleCertFile = middleCertFile; + } + + public String getRootCertFile() { + return rootCertFile; + } + + public void setRootCertFile(String rootCertFile) { + this.rootCertFile = rootCertFile; + } + + public String getChainCertFile() { + return chainCertFile; + } + + public void setChainCertFile(String chainCertFile) { + this.chainCertFile = chainCertFile; + } + + public static long getSerialversionuid() { + return serialVersionUID; + } + + @Override + public String toString() { + return "NtcSslRecordLog [logId=" + logId + ", version=" + version + ", sni=" + sni + ", san=" + san + ", cn=" + + cn + ", individualCertFile=" + individualCertFile + ", middleCertFile=" + middleCertFile + + ", rootCertFile=" + rootCertFile + ", chainCertFile=" + chainCertFile + ", cfgId=" + cfgId + + ", foundTime=" + foundTime + ", recvTime=" + recvTime + ", transProto=" + transProto + ", addrType=" + + addrType + ", dIp=" + dIp + ", sIp=" + sIp + ", dPort=" + dPort + ", sPort=" + sPort + ", service=" + + service + ", entranceId=" + entranceId + ", deviceId=" + deviceId + ", direction=" + direction + + ", streamDir=" + streamDir + ", capIp=" + capIp + ", addrList=" + addrList + ", serverLocate=" + + serverLocate + ", clientLocate=" + clientLocate + ", sAsn=" + sAsn + ", dAsn=" + dAsn + + ", sSubscribeId=" + sSubscribeId + ", dSubscribeId=" + dSubscribeId + ", sceneFile=" + sceneFile + + ", functionId=" + functionId + ", action=" + action + ", date=" + date + ", seltype=" + seltype + + ", searchFoundStartTime=" + searchFoundStartTime + ", searchFoundEndTime=" + searchFoundEndTime + + ", isLogTotalSearch=" + isLogTotalSearch + ", orderBy=" + orderBy + ", encapType=" + encapType + + ", linkId=" + linkId + ", innerSmac=" + innerSmac + ", innerDmac=" + innerDmac + ", id=" + id + + ", currentUser=" + currentUser + ", page=" + page + ", pageLog=" + pageLog + ", sqlMap=" + sqlMap + + ", isNewRecord=" + isNewRecord + ", isFilterAction=" + isFilterAction + "]"; + } + +} diff --git a/src/main/java/com/nis/util/Constants.java b/src/main/java/com/nis/util/Constants.java index ea5ba0e67..941b3a1ee 100644 --- a/src/main/java/com/nis/util/Constants.java +++ b/src/main/java/com/nis/util/Constants.java @@ -805,4 +805,9 @@ public final class Constants { //配置启停服务接口方法 public static final String CONFIG_START_STOP_UPDATE=Configurations.getStringProperty("configStartStop", "configStartStop"); + + /** + * 流量日志的SSL泛收接口URL + */ + public static final String NTC_SSL_RECORD_LOG = Configurations.getStringProperty("ntcSslRecordLog",""); } diff --git a/src/main/java/com/nis/web/controller/log/ntc/MailRecordLogController.java b/src/main/java/com/nis/web/controller/log/ntc/MailRecordLogController.java new file mode 100644 index 000000000..e9f077f8c --- /dev/null +++ b/src/main/java/com/nis/web/controller/log/ntc/MailRecordLogController.java @@ -0,0 +1,171 @@ +package com.nis.web.controller.log.ntc; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.apache.commons.lang.StringEscapeUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.BeanUtils; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.ModelAttribute; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.servlet.mvc.support.RedirectAttributes; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.reflect.TypeToken; +import com.nis.domain.FunctionServiceDict; +import com.nis.domain.Page; +import com.nis.domain.PageLog; +import com.nis.domain.SysUser; +import com.nis.domain.log.NtcIpLog; +import com.nis.domain.log.NtcMailLog; +import com.nis.domain.log.NtcMailLog; +import com.nis.domain.maat.LogRecvData; +import com.nis.util.Constants; +import com.nis.util.DictUtils; +import com.nis.util.httpclient.HttpClientUtil; +import com.nis.web.controller.BaseController; +import com.nis.web.security.UserUtils; + +@Controller +@RequestMapping("${adminPath}/log/ntc/mailRecord") +public class MailRecordLogController extends BaseController { + + @RequestMapping(value = { "list", "" }) + public String list(@ModelAttribute("log") NtcMailLog log, Model model, HttpServletRequest request, + HttpServletResponse response) { + try { + PageLog page = new PageLog(request, response); + Map params = new HashMap(); + params.put("pageSize", page.getPageSize()); + params.put("pageNo", page.getPageNo()); + initLogSearchValue(log, params); + + // 增加收/发件人、邮件主题查询 + if (StringUtils.isNotBlank(log.getMailTo())) { + params.put("searchMailTo", StringEscapeUtils.unescapeHtml(log.getMailTo())); + } + if (StringUtils.isNotBlank(log.getMailFrom())) { + params.put("searchMailFrom", StringEscapeUtils.unescapeHtml(log.getMailFrom())); + } + if (StringUtils.isNotBlank(log.getSubject())) { + params.put("searchSubject", StringEscapeUtils.unescapeHtml(log.getSubject())); + } + + params.put("searchCfgId", "0");// 邮件泛收 cfg_id=0 + List serviceList = DictUtils.getFunctionServiceDictList(log.getFunctionId()); + model.addAttribute("serviceList", serviceList); + + String url = Constants.LOG_BASE_URL + Constants.NTC_MAIL_LOG; + String recv = HttpClientUtil.getMsg(url, params, request); + + if (StringUtils.isNotBlank(recv)) { + Gson gson = new GsonBuilder().create(); + LogRecvData fromJson = gson.fromJson(recv, new TypeToken>() { + }.getType()); + if (fromJson.getStatus().intValue() == 200) { + Page data = fromJson.getData(); + page.setCount(data.getCount()); + page.setLast(data.getLast()); + page.setList(data.getList()); + List list = page.getList(); + for (NtcMailLog l : list) { + l.setFunctionId(log.getFunctionId()); + setLogAction(l, serviceList); + } + model.addAttribute("page", page); + } + } + } catch (Exception e) { + logger.error("查询失败", e); + addMessageLog(model, e.getMessage()); + } + + return "/log/ntc/mailRecordList"; + } + + // Mail泛收导出 + @RequestMapping(value = "exportMail") + public void exportMail(@ModelAttribute("log") NtcMailLog log, Model model, String hColumns, String type, + HttpServletRequest request, HttpServletResponse response, RedirectAttributes redirectAttributes) { + System.out.println("进来了Mail泛收"); + try { + // export data info + List titleList = new ArrayList(); + Map> classMap = new HashMap>(); + Map dataMap = new HashMap(); + Map noExportMap = new HashMap(); + // --------------------------- + PageLog page = new PageLog(request, response); + page.setPageNo(1); + page.setPageSize(Constants.MAX_LOG_EXPORT_SIZE); + Map params = new HashMap(); + params.put("pageSize", page.getPageSize()); + params.put("pageNo", page.getPageNo()); + initLogSearchValue(log, params); + + // 增加收/发件人、邮件主题查询 + if (StringUtils.isNotBlank(log.getMailTo())) { + params.put("searchMailTo", StringEscapeUtils.unescapeHtml(log.getMailTo())); + } + if (StringUtils.isNotBlank(log.getMailFrom())) { + params.put("searchMailFrom", StringEscapeUtils.unescapeHtml(log.getMailFrom())); + } + if (StringUtils.isNotBlank(log.getSubject())) { + params.put("searchSubject", StringEscapeUtils.unescapeHtml(log.getSubject())); + } + + params.put("searchCfgId", "0");// 邮件泛收 cfg_id=0 + List serviceList = DictUtils.getFunctionServiceDictList(log.getFunctionId()); + model.addAttribute("serviceList", serviceList); + + String url = Constants.LOG_BASE_URL + Constants.NTC_MAIL_LOG; + String recv = HttpClientUtil.getMsg(url, params, request); + List list = new ArrayList(); + if (StringUtils.isNotBlank(recv)) { + Gson gson = new GsonBuilder().create(); + LogRecvData fromJson = gson.fromJson(recv, new TypeToken>() { + }.getType()); + if (fromJson.getStatus().intValue() == 200) { + Page data = fromJson.getData(); + list = data.getList(); + } + } + for (NtcMailLog l : list) { + l.setFunctionId(log.getFunctionId()); + setLogAction(l, serviceList); + } + titleList.add("mail_record"); + classMap.put("mail_record", NtcMailLog.class); + SysUser user = UserUtils.getUser(); + if (!user.isAdmin()) { + hColumns += ",scene_file,"; + } else { + hColumns += ","; + } + String cfgIndexInfoNoExport = "," + hColumns; + noExportMap.put("mail_record", cfgIndexInfoNoExport); + dataMap.put("mail_record", list); + String timeRange = initLogMap(log, "mail_record"); + noExportMap.put("timeRange", timeRange); + /* } */ + if ("csv".equals(type)) { + this._exportCsv(model, request, response, redirectAttributes, "mail_record", titleList, classMap, + dataMap, noExportMap); + } else { + this._export(model, request, response, redirectAttributes, "mail_record", titleList, classMap, dataMap, + noExportMap); + } + } catch (Exception e) { + logger.error("mail_record export failed", e); + addMessage(redirectAttributes, "error", "export_failed"); + } + } +} diff --git a/src/main/java/com/nis/web/controller/log/ntc/SslRecordLogController.java b/src/main/java/com/nis/web/controller/log/ntc/SslRecordLogController.java new file mode 100644 index 000000000..f2b9d7b44 --- /dev/null +++ b/src/main/java/com/nis/web/controller/log/ntc/SslRecordLogController.java @@ -0,0 +1,158 @@ +package com.nis.web.controller.log.ntc; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.springframework.beans.BeanUtils; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.ModelAttribute; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.servlet.mvc.support.RedirectAttributes; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.JsonSyntaxException; +import com.google.gson.reflect.TypeToken; +import com.nis.domain.FunctionServiceDict; +import com.nis.domain.Page; +import com.nis.domain.PageLog; +import com.nis.domain.SysUser; +import com.nis.domain.log.NtcSslRecordLog; +import com.nis.domain.log.NtcSshLog; +import com.nis.domain.log.NtcSslRecordLog; +import com.nis.domain.maat.LogRecvData; +import com.nis.util.Constants; +import com.nis.util.DictUtils; +import com.nis.util.StringUtils; +import com.nis.util.httpclient.HttpClientUtil; +import com.nis.web.controller.BaseController; +import com.nis.web.security.UserUtils; + +@Controller +@RequestMapping("${adminPath}/log/ntc/sslRecord") +@SuppressWarnings("all") +public class SslRecordLogController extends BaseController { + + @RequestMapping(value = { "list", "" }) + public String list(HttpServletRequest request, HttpServletResponse response, Model model, + @ModelAttribute("log") NtcSslRecordLog NtcSslRecordLog) { + + PageLog page = new PageLog(request, response); + Map params = new HashMap(); + params.put("pageSize", page.getPageSize()); + params.put("pageNo", page.getPageNo()); + + // 请求参数判断 + initLogSearchValue(NtcSslRecordLog, params); + if (StringUtils.isNotBlank(NtcSslRecordLog.getSni())) { + params.put("SearchSni", NtcSslRecordLog.getSni()); + } + + List serviceList = DictUtils.getFunctionServiceDictList(NtcSslRecordLog.getFunctionId()); + model.addAttribute("serviceList", serviceList); + + try { + // 请求接口 + String url = Constants.LOG_BASE_URL + Constants.NTC_SSL_RECORD_LOG; + String resJson = HttpClientUtil.getMsg(url, params, request); + Gson gson = new GsonBuilder().create(); + LogRecvData fromJson = gson.fromJson(resJson, + new TypeToken>() { + }.getType()); + if (fromJson.getStatus().intValue() == 200) { + Page data = fromJson.getData(); + page.setCount(data.getCount()); + page.setLast(data.getLast()); + page.setList(data.getList()); + List list = page.getList(); + for (NtcSslRecordLog log : list) { + log.setFunctionId(NtcSslRecordLog.getFunctionId()); + setLogAction(log, serviceList); + } + model.addAttribute("page", page); + } + } catch (Exception e) { + logger.error("SSL泛收日志查询失败", e); + addMessageLog(model, e.getMessage()); + } + + return "/log/ntc/sslRecordLogList"; + } + + // Ssl泛收配置导出 + @RequestMapping(value = "exportSsl") + public void exportSsl(@ModelAttribute("log") NtcSslRecordLog log, Model model, String hColumns, String type, + HttpServletRequest request, HttpServletResponse response, RedirectAttributes redirectAttributes) { + System.out.println("进来了ssl泛收"); + try { + // export data info + List titleList = new ArrayList(); + Map> classMap = new HashMap>(); + Map dataMap = new HashMap(); + Map noExportMap = new HashMap(); + PageLog page = new PageLog(request, response); + List list = new ArrayList(); + page.setPageNo(1); + page.setPageSize(Constants.MAX_LOG_EXPORT_SIZE); + // --------------------------- + Map params = new HashMap(); + params.put("pageSize", page.getPageSize()); + params.put("pageNo", page.getPageNo()); + // 请求参数判断 + initLogSearchValue(log, params); + if (StringUtils.isNotBlank(log.getSni())) { + params.put("SearchSni", log.getSni()); + } + + List serviceList = DictUtils.getFunctionServiceDictList(log.getFunctionId()); + model.addAttribute("serviceList", serviceList); + + String url = Constants.LOG_BASE_URL + Constants.NTC_SSL_RECORD_LOG; + String recv = HttpClientUtil.getMsg(url, params, request); + if (StringUtils.isNotBlank(recv)) { + Gson gson = new GsonBuilder().create(); + LogRecvData fromJson = gson.fromJson(recv, + new TypeToken>() { + }.getType()); + if (fromJson.getStatus().intValue() == 200) { + Page data = fromJson.getData(); + list = data.getList(); + } + } + for (NtcSslRecordLog l : list) { + l.setFunctionId(log.getFunctionId()); + setLogAction(l, serviceList); + } + titleList.add("ssl_record"); + classMap.put("ssl_record", NtcSslRecordLog.class); + SysUser user = UserUtils.getUser(); + if (!user.isAdmin()) { + hColumns += ",scene_file,"; + } else { + hColumns += ","; + } + String cfgIndexInfoNoExport = "," + hColumns; + noExportMap.put("ssl_record", cfgIndexInfoNoExport); + dataMap.put("ssl_record", list); + String timeRange = initLogMap(log, "ssl_record"); + noExportMap.put("timeRange", timeRange); + /* } */ + if ("csv".equals(type)) { + this._exportCsv(model, request, response, redirectAttributes, "ssl_record", titleList, classMap, + dataMap, noExportMap); + } else { + this._export(model, request, response, redirectAttributes, "ssl_record", titleList, classMap, dataMap, + noExportMap); + } + } catch (Exception e) { + logger.error("ssl_record export failed", e); + addMessage(redirectAttributes, "error", "export_failed"); + } + } +} diff --git a/src/main/resources/nis.properties b/src/main/resources/nis.properties index a667d00d1..efdaf43f0 100644 --- a/src/main/resources/nis.properties +++ b/src/main/resources/nis.properties @@ -613,4 +613,6 @@ blockAndDropStat=v1/blockAndDropStat #\u914d\u7f6e\u542f\u505c\u63a5\u53e3 configStartStop=v2/configStartStop trafficAppTrend=v1/trafficAppTrend -appConnRecordTop100=v1/appConnRecordTop100 \ No newline at end of file +appConnRecordTop100=v1/appConnRecordTop100 +#SSL\u6cdb\u6536 +ntcSslRecordLog=v1/ntcSslRecordLogs \ No newline at end of file diff --git a/src/main/webapp/WEB-INF/views/log/ntc/mailList.jsp b/src/main/webapp/WEB-INF/views/log/ntc/mailList.jsp index 863b09b06..a6779cd70 100644 --- a/src/main/webapp/WEB-INF/views/log/ntc/mailList.jsp +++ b/src/main/webapp/WEB-INF/views/log/ntc/mailList.jsp @@ -66,6 +66,16 @@ $("#"+closeId).parent().parent().next("tr").hide(); }); }); + + function warn_tips(){ + if ($("#cfgId").val()==0&&$("#cfgId").val()!='') { + top.$.jBox.tip("", ""); + $("#cfgId").val(''); + return; + }else{ + return page(); + } + } @@ -126,7 +136,7 @@
- +
@@ -201,7 +211,7 @@
- +
diff --git a/src/main/webapp/WEB-INF/views/log/ntc/mailRecordList.jsp b/src/main/webapp/WEB-INF/views/log/ntc/mailRecordList.jsp new file mode 100644 index 000000000..5209e0d1d --- /dev/null +++ b/src/main/webapp/WEB-INF/views/log/ntc/mailRecordList.jsp @@ -0,0 +1,423 @@ +<%@ page contentType="text/html;charset=UTF-8"%> +<%@ include file="/WEB-INF/include/taglib.jsp"%> + + + + MAIL Record<spring:message code="log"></spring:message> + + + + + +
+ +

+ +

+ +
+
+
+
+ + + + + + + + +
+
+ + + + + + + + + + +
+
+
+
+ +
+ <%-- --%> + +
+
+
+
+
+ +
+ <%-- --%> + +
+
+
+ + + +
+
+
+ + +
+ href="javascript:;"> + + +
+
+ + + +
+
+
+
+ + + + + + + +
+
+ +
+
+ + +
+
+ +
+
+ + + + + + + +
+
+ +
+
+ + +
+
+ +
+
+ + +
+
+
+
+ + +<%-- --%> +<%-- --%> + + + +
+
+ + +
+
+ +
+
+ + +
+
+ +
+
+ + +
+
+ +
+
+ +
+
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <%-- --%> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <%-- --%> + + + + +
+<%-- --%> + + ${log.cfgId } + ${log.action } + + + ${dict.itemValue} + + + + ${log.foundTime }${log.recvTime } + ${log.entranceId } + + + ${dic.itemValue} + + + + ${log.mailProto } + ${log.mailFrom} + + ${log.mailTo} + ${log.subject } + + + ${fn:substring(log.emlFile,0,20) } + + + + + http://${fn:substring(log.emlFile,0,20) } + + + ${fns:abbr(log.emlKey, 42)}${log.capIp} + ${log.transProto } + + + ${dic.itemValue} + + + + + ${log.addrType } + + + ${dic.itemValue} + + + + ${log.dIp}${log.sIp}${log.dPort }${log.sPort } + ${log.deviceId } + + + ${device.itemValue} + + + + + ${log.linkId } + + + ${link.itemValue} + + + + + ${log.encapType } + + + ${encapType.itemValue} + + + + + ${log.direction } + + + ${direction.itemValue} + + + + ${log.innerSmac }${log.innerDmac } + ${log.streamDir } + + + ${streamType.itemValue} + + + + ${log.addrList }${log.serverLocate}${log.clientLocate}${log.sAsn}${log.dAsn}${log.sSubscribeId}${log.dSubscribeId}${log.userRegion}${log.sceneFile}
+
${page}
+
+
+
+
+
+ + \ No newline at end of file diff --git a/src/main/webapp/WEB-INF/views/log/ntc/sslRecordLogList.jsp b/src/main/webapp/WEB-INF/views/log/ntc/sslRecordLogList.jsp new file mode 100644 index 000000000..93671ebed --- /dev/null +++ b/src/main/webapp/WEB-INF/views/log/ntc/sslRecordLogList.jsp @@ -0,0 +1,412 @@ +<%@ page contentType="text/html;charset=UTF-8"%> +<%@ include file="/WEB-INF/include/taglib.jsp"%> + + + + + + + + + +
+ +

+ +

+ +
+
+ +
+ +
+ + + + + + + + + +
+
+ + + + + + + + + + +
+
+
+
+ SNI +
+ +
+
+
+
+
+ +
+ <%-- --%> + +
+
+
+
+
+ +
+ <%-- --%> + +
+
+
+ + + +
+ +
+
+ + +
+ href="javascript:;"> + + +
+
+ + + +
+
+
+
+ + + + + + + +
+
+ +
+
+ + +
+
+ +
+
+ + + + + + + +
+
+ +
+
+ + +
+
+ +
+
+ + +
+
+ + <%--
+
+ + + + + + + +
+
--%> +
+
+
+
+ + +
+
+
+
+
+ +
+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <%-- --%> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <%-- --%> + + + + +
SNISANCN
+<%-- --%> + + ${log.cfgId } + ${log.action } + + + ${dict.itemValue} + + + + ${log.foundTime }${log.recvTime } + ${log.entranceId } + + + ${dic.itemValue} + + + + ${log.version }${log.sni }${log.san }${log.cn }${log.capIp} + ${log.transProto } + + + ${dic.itemValue} + + + + + ${log.addrType } + + + ${dic.itemValue} + + + + ${log.dIp}${log.sIp}${log.dPort }${log.sPort } + ${log.deviceId } + + + ${device.itemValue} + + + + + ${log.linkId } + + + ${link.itemValue} + + + + + ${log.encapType } + + + ${encapType.itemValue} + + + + + ${log.direction } + + + ${direction.itemValue} + + + + ${log.innerSmac }${log.innerDmac } + ${log.streamDir } + + + ${streamType.itemValue} + + + + ${log.addrList }${log.serverLocate}${log.clientLocate}${log.sAsn}${log.dAsn}${log.sSubscribeId}${log.dSubscribeId}${log.userRegion}${log.sceneFile}
${page}
+
+
+
+
+
+ +