From 6b05f1fbbbfb6f09d832ca9d9854fa952b094dce Mon Sep 17 00:00:00 2001 From: neil <459208047@qq.com> Date: Mon, 24 Jul 2017 18:41:39 +0800 Subject: [PATCH 1/3] =?UTF-8?q?REPORT-2539=20=E6=A8=A1=E6=9D=BF=E6=8A=A5?= =?UTF-8?q?=E9=94=99=E6=94=B6=E9=9B=86=E5=88=B0=E4=BA=91=E4=B8=AD=E5=BF=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mainframe/InformationCollector.java | 2 + .../design/mainframe/errorinfo/ErrorInfo.java | 130 ++++++++++++++++ .../errorinfo/ErrorInfoLogAppender.java | 139 ++++++++++++++++++ .../errorinfo/ErrorInfoUploader.java | 98 ++++++++++++ 4 files changed, 369 insertions(+) create mode 100644 designer/src/com/fr/design/mainframe/errorinfo/ErrorInfo.java create mode 100644 designer/src/com/fr/design/mainframe/errorinfo/ErrorInfoLogAppender.java create mode 100644 designer/src/com/fr/design/mainframe/errorinfo/ErrorInfoUploader.java diff --git a/designer/src/com/fr/design/mainframe/InformationCollector.java b/designer/src/com/fr/design/mainframe/InformationCollector.java index f50cc5dad..4bac9a15b 100644 --- a/designer/src/com/fr/design/mainframe/InformationCollector.java +++ b/designer/src/com/fr/design/mainframe/InformationCollector.java @@ -10,6 +10,7 @@ import com.fr.data.core.db.dml.Delete; import com.fr.data.core.db.dml.Select; import com.fr.data.core.db.dml.Table; import com.fr.design.DesignerEnvManager; +import com.fr.design.mainframe.errorinfo.ErrorInfoUploader; import com.fr.design.mainframe.templateinfo.TemplateInfoCollector; import com.fr.general.*; import com.fr.general.http.HttpClient; @@ -317,6 +318,7 @@ public class InformationCollector implements XMLReadable, XMLWriter { sendFunctionsInfo(); sendUserInfo(); TemplateInfoCollector.getInstance().sendTemplateInfo(); + ErrorInfoUploader.getInstance().sendErrorInfo(); } }); sendThread.start(); diff --git a/designer/src/com/fr/design/mainframe/errorinfo/ErrorInfo.java b/designer/src/com/fr/design/mainframe/errorinfo/ErrorInfo.java new file mode 100644 index 000000000..5f048caab --- /dev/null +++ b/designer/src/com/fr/design/mainframe/errorinfo/ErrorInfo.java @@ -0,0 +1,130 @@ +package com.fr.design.mainframe.errorinfo; + +import com.fr.base.FRContext; +import com.fr.general.IOUtils; +import com.fr.json.JSONException; +import com.fr.json.JSONObject; +import com.fr.stable.EncodeConstants; +import com.fr.stable.ProductConstants; +import com.fr.stable.StableUtils; +import com.fr.stable.core.UUID; + +import java.io.*; +import java.text.DateFormat; +import java.util.Date; + +/** + * Created by Administrator on 2017/7/24 0024. + */ +public class ErrorInfo { + + private String username; + private String uuid; + private String activekey; + private String uploadtime; + private String templateid; + private String logid; + private String log; + + public ErrorInfo(String username, String uuid, String activekey) { + this.username = username; + this.uuid = uuid; + this.activekey = activekey; + this.uploadtime = dateToString(); + } + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public String getUuid() { + return uuid; + } + + public void setUuid(String uuid) { + this.uuid = uuid; + } + + public String getActivekey() { + return activekey; + } + + public void setActivekey(String activekey) { + this.activekey = activekey; + } + + public String getUploadtime() { + return uploadtime; + } + + public void setUploadtime(String uploadtime) { + this.uploadtime = uploadtime; + } + + public String getTemplateid() { + return templateid; + } + + public void setTemplateid(String templateid) { + this.templateid = templateid; + } + + public String getLogid() { + return logid; + } + + public void setLogid(String logid) { + this.logid = logid; + } + + public String getLog() { + return log; + } + + public void setLog(String log) { + this.log = log; + } + + private String dateToString(){ + DateFormat df = FRContext.getDefaultValues().getDateTimeFormat(); + return df.format(new Date()); + } + + /** + * 将出错对象存为json字符串, 并放到设计器缓存目录. + * 等下一次上传到云中心. + */ + public void saveAsJSON(){ + JSONObject jo = JSONObject.create(); + try { + jo.put("username", username); + jo.put("uuid", uuid); + jo.put("activekey", activekey); + jo.put("templateid", templateid); + jo.put("uploadtime", uploadtime); + jo.put("logid", logid); + jo.put("log", log); + } catch (JSONException ignore) { + } + + saveFileToCache(jo); + } + + private void saveFileToCache(JSONObject jo) { + String content = jo.toString(); + String fileName = UUID.randomUUID() + ErrorInfoUploader.SUFFIX; + File file = new File(StableUtils.pathJoin(ProductConstants.getEnvHome(), ErrorInfoUploader.FOLDER_NAME, fileName)); + try { + StableUtils.makesureFileExist(file); + FileOutputStream out = new FileOutputStream(file); + InputStream in = new ByteArrayInputStream(content.getBytes(EncodeConstants.ENCODING_UTF_8)); + IOUtils.copyBinaryTo(in, out); + out.close(); + } catch (IOException ignore) { + } + } +} diff --git a/designer/src/com/fr/design/mainframe/errorinfo/ErrorInfoLogAppender.java b/designer/src/com/fr/design/mainframe/errorinfo/ErrorInfoLogAppender.java new file mode 100644 index 000000000..f7423d2ba --- /dev/null +++ b/designer/src/com/fr/design/mainframe/errorinfo/ErrorInfoLogAppender.java @@ -0,0 +1,139 @@ +package com.fr.design.mainframe.errorinfo; + +import com.fr.base.FRContext; +import com.fr.base.io.IOFile; +import com.fr.base.io.XMLReadHelper; +import com.fr.design.DesignerEnvManager; +import com.fr.general.FRLogLevel; +import com.fr.general.FRLogManager; +import com.fr.general.LogDuration; +import com.fr.stable.StringUtils; +import com.fr.stable.project.ProjectConstants; +import com.fr.stable.xml.XMLPrintWriter; +import com.fr.stable.xml.XMLableReader; +import com.fr.web.core.SessionDealWith; +import com.fr.web.core.SessionIDInfor; +import org.apache.log4j.AppenderSkeleton; +import org.apache.log4j.Level; +import org.apache.log4j.spi.LoggingEvent; + +import java.io.InputStream; + +/** + * 收集设计器报错信息的appender. + *

+ * Created by Administrator on 2017/7/24 0024. + */ +public class ErrorInfoLogAppender extends AppenderSkeleton { + + private static final int ERROR_LEN = 8; + + // 缓存下不变的, 没必要频繁取. + private String username; + private String uuid; + private String activekey; + + public ErrorInfoLogAppender() { + this.layout = new org.apache.log4j.PatternLayout("%d{HH:mm:ss} %t %p [%c] %m%n"); + + DesignerEnvManager envManager = DesignerEnvManager.getEnvManager(); + this.username = envManager.getBBSName(); + this.uuid = envManager.getUUID(); + this.activekey = envManager.getActivationKey(); + } + + protected void append(LoggingEvent event) { + this.subAppend(event); + } + + public boolean requiresLayout() { + return true; + } + + public synchronized void close() { + if (this.closed) { + return; + } + this.closed = true; + + } + + public void subAppend(LoggingEvent event) { + Level level = event.getLevel(); + // 只分析上传记录error以上的. + if (level.isGreaterOrEqual(FRLogLevel.ERROR)) { + String msg = this.layout.format(event); + // 这个id并不是一定会有的, 有就记录下, 说明是预览模板出的错. + String templateid = readTemplateID(); + String logid = readLogID(msg); + ErrorInfo errorInfo = new ErrorInfo(username, uuid, activekey); + errorInfo.setTemplateid(templateid); + errorInfo.setLog(msg); + errorInfo.setLogid(logid); + errorInfo.saveAsJSON(); + } + } + + private String readLogID(String log) { + int dotIndex = log.lastIndexOf(":"); + if (dotIndex != -1) { + int end = Math.min(dotIndex + ERROR_LEN, log.length()); + String logid = log.substring(dotIndex + 1, end).trim(); + try { + Long.parseLong(logid); + return logid; + } catch (Exception ignore) { + + } + } + + return StringUtils.EMPTY; + } + + private String readTemplateID() { + LogDuration logDuration = FRLogManager.getSession(); + if (logDuration == null) { + return StringUtils.EMPTY; + } + + String sessionID = logDuration.getSessionID(); + SessionIDInfor infor = SessionDealWith.getSessionIDInfor(sessionID); + if (infor == null) { + return StringUtils.EMPTY; + } + + String bookPath = infor.getBookPath(); + // 这个iofile只读一个templateid, 其他以后有需要再读. + IOFile file = new IOFile() { + @Override + public void readStream(InputStream in) throws Exception { + XMLableReader xmlReader = XMLReadHelper.createXMLableReader(in, XMLPrintWriter.XML_ENCODER); + xmlReader.readXMLObject(this); + xmlReader.close(); + in.close(); + } + + @Override + public void readXML(XMLableReader reader) { + super.readXML(reader); + readDesign(reader); + } + + @Override + protected String openTag() { + return StringUtils.EMPTY; + } + + @Override + protected void mainContent(XMLPrintWriter writer) { + } + }; + try { + file.readStream(FRContext.getCurrentEnv().readBean(bookPath, ProjectConstants.REPORTLETS_NAME)); + return file.getTemplateID(); + } catch (Exception ignore) { + } + + return StringUtils.EMPTY; + } +} \ No newline at end of file diff --git a/designer/src/com/fr/design/mainframe/errorinfo/ErrorInfoUploader.java b/designer/src/com/fr/design/mainframe/errorinfo/ErrorInfoUploader.java new file mode 100644 index 000000000..2ec8c6a3e --- /dev/null +++ b/designer/src/com/fr/design/mainframe/errorinfo/ErrorInfoUploader.java @@ -0,0 +1,98 @@ +package com.fr.design.mainframe.errorinfo; + +import com.fr.general.*; +import com.fr.general.http.HttpClient; +import com.fr.json.JSONObject; +import com.fr.stable.CodeUtils; +import com.fr.stable.EnvChangedListener; +import com.fr.stable.ProductConstants; +import com.fr.stable.StableUtils; + +import java.io.File; +import java.io.FileInputStream; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.HashMap; + +/** + * Created by Administrator on 2017/7/24 0024. + */ +public class ErrorInfoUploader { + + public static final String SUFFIX = ".json"; + public static final String FOLDER_NAME = "errorInfo"; + + private static ErrorInfoUploader collector; + + static { + GeneralContext.addEnvChangedListener(new EnvChangedListener() { + @Override + public void envChanged() { + FRLogger.getLogger().addLogAppender(new ErrorInfoLogAppender()); + } + }); + } + + private ErrorInfoUploader() { + FRLogger.getLogger().addLogAppender(new ErrorInfoLogAppender()); + } + + public static ErrorInfoUploader getInstance() { + if (collector == null) { + collector = new ErrorInfoUploader(); + } + + return collector; + } + + public void sendErrorInfo(){ + //读取文件夹里的json, 加入上传队列中. + File folder = new File(StableUtils.pathJoin(ProductConstants.getEnvHome(), FOLDER_NAME)); + if (!folder.exists()) { + return; + } + + File[] files = folder.listFiles(); + try { + for (File file : files) { + String filePath = file.getPath(); + String suffix = filePath.substring(filePath.lastIndexOf(".")); + + Thread.sleep(1000L); + if (suffix.endsWith(SUFFIX)) { + String content = IOUtils.inputStream2String(new FileInputStream(file)); + String url = SiteCenter.getInstance().acquireUrlByKind("design.error"); + if (sendErroInfo(url, content)) { + file.delete(); + } + } + } + } catch (Exception ignore) { + + } + } + + private boolean sendErroInfo(String url, String content) { + HashMap para = new HashMap<>(); + String date = new SimpleDateFormat("yyyy-MM-dd").format(Calendar.getInstance().getTime()); + para.put("token", CodeUtils.md5Encode(date, "", "MD5")); + para.put("content", content); + HttpClient httpClient = new HttpClient(url, para, true); + httpClient.asGet(); + + if (!httpClient.isServerAlive()) { + return false; + } + + String res = httpClient.getResponseText(); + boolean success; + try { + success = ComparatorUtils.equals(new JSONObject(res).get("status"), "success"); + } catch (Exception ex) { + success = false; + } + return success; + } + + +} From 15f5f6b4341c5cdc634944b7974be8675d078d93 Mon Sep 17 00:00:00 2001 From: neil <459208047@qq.com> Date: Mon, 24 Jul 2017 18:42:57 +0800 Subject: [PATCH 2/3] utf8 --- .../com/fr/design/mainframe/errorinfo/ErrorInfo.java | 4 ++-- .../mainframe/errorinfo/ErrorInfoLogAppender.java | 10 +++++----- .../design/mainframe/errorinfo/ErrorInfoUploader.java | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/designer/src/com/fr/design/mainframe/errorinfo/ErrorInfo.java b/designer/src/com/fr/design/mainframe/errorinfo/ErrorInfo.java index 5f048caab..c10170649 100644 --- a/designer/src/com/fr/design/mainframe/errorinfo/ErrorInfo.java +++ b/designer/src/com/fr/design/mainframe/errorinfo/ErrorInfo.java @@ -95,8 +95,8 @@ public class ErrorInfo { } /** - * 将出错对象存为json字符串, 并放到设计器缓存目录. - * 等下一次上传到云中心. + * 灏嗗嚭閿欏璞″瓨涓簀son瀛楃涓, 骞舵斁鍒拌璁″櫒缂撳瓨鐩綍. + * 绛変笅涓娆′笂浼犲埌浜戜腑蹇. */ public void saveAsJSON(){ JSONObject jo = JSONObject.create(); diff --git a/designer/src/com/fr/design/mainframe/errorinfo/ErrorInfoLogAppender.java b/designer/src/com/fr/design/mainframe/errorinfo/ErrorInfoLogAppender.java index f7423d2ba..1d4f65de5 100644 --- a/designer/src/com/fr/design/mainframe/errorinfo/ErrorInfoLogAppender.java +++ b/designer/src/com/fr/design/mainframe/errorinfo/ErrorInfoLogAppender.java @@ -20,7 +20,7 @@ import org.apache.log4j.spi.LoggingEvent; import java.io.InputStream; /** - * 收集设计器报错信息的appender. + * 鏀堕泦璁捐鍣ㄦ姤閿欎俊鎭殑appender. *

* Created by Administrator on 2017/7/24 0024. */ @@ -28,7 +28,7 @@ public class ErrorInfoLogAppender extends AppenderSkeleton { private static final int ERROR_LEN = 8; - // 缓存下不变的, 没必要频繁取. + // 缂撳瓨涓嬩笉鍙樼殑, 娌″繀瑕侀绻佸彇. private String username; private String uuid; private String activekey; @@ -60,10 +60,10 @@ public class ErrorInfoLogAppender extends AppenderSkeleton { public void subAppend(LoggingEvent event) { Level level = event.getLevel(); - // 只分析上传记录error以上的. + // 鍙垎鏋愪笂浼犺褰昬rror浠ヤ笂鐨. if (level.isGreaterOrEqual(FRLogLevel.ERROR)) { String msg = this.layout.format(event); - // 这个id并不是一定会有的, 有就记录下, 说明是预览模板出的错. + // 杩欎釜id骞朵笉鏄竴瀹氫細鏈夌殑, 鏈夊氨璁板綍涓, 璇存槑鏄瑙堟ā鏉垮嚭鐨勯敊. String templateid = readTemplateID(); String logid = readLogID(msg); ErrorInfo errorInfo = new ErrorInfo(username, uuid, activekey); @@ -103,7 +103,7 @@ public class ErrorInfoLogAppender extends AppenderSkeleton { } String bookPath = infor.getBookPath(); - // 这个iofile只读一个templateid, 其他以后有需要再读. + // 杩欎釜iofile鍙涓涓猼emplateid, 鍏朵粬浠ュ悗鏈夐渶瑕佸啀璇. IOFile file = new IOFile() { @Override public void readStream(InputStream in) throws Exception { diff --git a/designer/src/com/fr/design/mainframe/errorinfo/ErrorInfoUploader.java b/designer/src/com/fr/design/mainframe/errorinfo/ErrorInfoUploader.java index 2ec8c6a3e..3ee85b572 100644 --- a/designer/src/com/fr/design/mainframe/errorinfo/ErrorInfoUploader.java +++ b/designer/src/com/fr/design/mainframe/errorinfo/ErrorInfoUploader.java @@ -46,7 +46,7 @@ public class ErrorInfoUploader { } public void sendErrorInfo(){ - //读取文件夹里的json, 加入上传队列中. + //璇诲彇鏂囦欢澶归噷鐨刯son, 鍔犲叆涓婁紶闃熷垪涓. File folder = new File(StableUtils.pathJoin(ProductConstants.getEnvHome(), FOLDER_NAME)); if (!folder.exists()) { return; From 13c06a5c7c75fe92d220f766c74be9f1534a322f Mon Sep 17 00:00:00 2001 From: neil <459208047@qq.com> Date: Mon, 24 Jul 2017 18:44:53 +0800 Subject: [PATCH 3/3] 1 --- .../com/fr/design/mainframe/errorinfo/ErrorInfoUploader.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/designer/src/com/fr/design/mainframe/errorinfo/ErrorInfoUploader.java b/designer/src/com/fr/design/mainframe/errorinfo/ErrorInfoUploader.java index 3ee85b572..0204d33a9 100644 --- a/designer/src/com/fr/design/mainframe/errorinfo/ErrorInfoUploader.java +++ b/designer/src/com/fr/design/mainframe/errorinfo/ErrorInfoUploader.java @@ -58,8 +58,8 @@ public class ErrorInfoUploader { String filePath = file.getPath(); String suffix = filePath.substring(filePath.lastIndexOf(".")); - Thread.sleep(1000L); if (suffix.endsWith(SUFFIX)) { + Thread.sleep(1000L); String content = IOUtils.inputStream2String(new FileInputStream(file)); String url = SiteCenter.getInstance().acquireUrlByKind("design.error"); if (sendErroInfo(url, content)) {