forked from fanruan/design
neil
8 years ago
4 changed files with 369 additions and 0 deletions
@ -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) { |
||||
} |
||||
} |
||||
} |
@ -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. |
||||
* <p> |
||||
* 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; |
||||
} |
||||
} |
@ -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<String, String> 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; |
||||
} |
||||
|
||||
|
||||
} |
Loading…
Reference in new issue