Commit 0c29ea54 authored by yanzg's avatar yanzg

修复异常提醒,从而正确的跟踪异常信息

parent a33890ee
...@@ -7,7 +7,9 @@ import com.yanzuoguang.util.log.Log; ...@@ -7,7 +7,9 @@ import com.yanzuoguang.util.log.Log;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.Date; import java.util.Date;
import java.util.List;
/** /**
* 整个模块的所有配置信息 * 整个模块的所有配置信息
...@@ -39,8 +41,13 @@ public class CloudConfig { ...@@ -39,8 +41,13 @@ public class CloudConfig {
/** /**
* 1个请求最长时间(毫秒) * 1个请求最长时间(毫秒)
*/ */
@Value("${yzg.log.time.max:30000}") @Value("${yzg.log.time.max:[0,100,300,1000,5000,30000]}")
private int logTimeMax; private List<Integer> logTimeMax = new ArrayList<>();
/**
* 死锁时间
*/
@Value("${yzg.log.time.lockTime:180000}")
private int lockTime;
/** /**
* 1个请求间隔记录时间(毫秒) * 1个请求间隔记录时间(毫秒)
*/ */
...@@ -103,10 +110,14 @@ public class CloudConfig { ...@@ -103,10 +110,14 @@ public class CloudConfig {
return reqSize; return reqSize;
} }
public int getLogTimeMax() { public List<Integer> getLogTimeMax() {
return logTimeMax; return logTimeMax;
} }
public int getLockTime() {
return lockTime;
}
public int getLogTimeSplit() { public int getLogTimeSplit() {
return logTimeSplit; return logTimeSplit;
} }
......
...@@ -41,14 +41,15 @@ public class AspectLogResult { ...@@ -41,14 +41,15 @@ public class AspectLogResult {
return; return;
} }
try { try {
log.setEnd(System.currentTimeMillis()); long end = System.currentTimeMillis();
long useTime = log.getEnd() - log.getStart(); long useTime = end - log.getStart();
log.setUseTime((int) useTime); log.setUseTime((int) useTime);
if (resultEx != null) { if (resultEx != null) {
log.setStatus(LogInfoVo.STATUS_ERROR); log.setStatus(LogInfoVo.STATUS_ERROR);
} else { } else {
log.setStatus(LogInfoVo.STATUS_OK); log.setStatus(LogInfoVo.STATUS_OK);
} }
log.setEnd(end);
ResponseResult<?> responseResult = getJson(resultFrom, resultEx); ResponseResult<?> responseResult = getJson(resultFrom, resultEx);
String json = JsonHelper.serialize(responseResult); String json = JsonHelper.serialize(responseResult);
......
...@@ -6,6 +6,7 @@ import com.yanzuoguang.util.vo.CloudConfig; ...@@ -6,6 +6,7 @@ import com.yanzuoguang.util.vo.CloudConfig;
import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.InitializingBean;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import java.util.List;
import java.util.Optional; import java.util.Optional;
import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.LinkedBlockingQueue;
...@@ -93,6 +94,14 @@ public class LogBase implements ThreadNext.Next, InitializingBean { ...@@ -93,6 +94,14 @@ public class LogBase implements ThreadNext.Next, InitializingBean {
return true; return true;
} }
public void notifyNotHandle(List<LogInfoVo> notHandles) {
logFeign.notifyNotHandle(notHandles);
}
public void notifyTodayCount(LogCountResult todayResult) {
logFeign.notifyTodayCount(todayResult);
}
/** /**
* 沉睡时间 * 沉睡时间
* *
......
package com.yanzuoguang.log; package com.yanzuoguang.log;
import com.yanzuoguang.util.vo.ResponseResult; import java.util.List;
/** /**
* 调用外置服务保存日志对象 * 调用外置服务保存日志对象
...@@ -13,7 +13,20 @@ public interface LogFeignBase { ...@@ -13,7 +13,20 @@ public interface LogFeignBase {
* 保存日志对象 * 保存日志对象
* *
* @param log 需要保存的日志对象 * @param log 需要保存的日志对象
* @return 日志服务返回结果
*/ */
ResponseResult<String> save(LogInfoVo log); void save(LogInfoVo log);
/**
* 今日处理中的请求
*
* @param notHandles 处理中的请求
*/
void notifyNotHandle(List<LogInfoVo> notHandles);
/**
* 通知今日结果
*
* @param todayResult 今日结果
*/
void notifyTodayCount(LogCountResult todayResult);
} }
package com.yanzuoguang.log; package com.yanzuoguang.log;
import com.yanzuoguang.util.vo.ResponseResult; import com.yanzuoguang.util.base.CollectionString;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import java.util.List;
/** /**
* 日志默认处理服务 * 日志默认处理服务
* *
...@@ -10,15 +12,24 @@ import org.springframework.stereotype.Component; ...@@ -10,15 +12,24 @@ import org.springframework.stereotype.Component;
*/ */
@Component @Component
public class LogFeignDefault implements LogFeignBase { public class LogFeignDefault implements LogFeignBase {
/** /**
* 保存日志对象 * 保存日志对象
* *
* @param log 需要保存的日志对象 * @param log 需要保存的日志对象
* @return 日志服务返回结果
*/ */
@Override @Override
public ResponseResult<String> save(LogInfoVo log) { public void save(LogInfoVo log) {
return ResponseResult.result("处理成功"); }
@Override
public void notifyNotHandle(List<LogInfoVo> notHandles) {
}
@Override
public void notifyTodayCount(LogCountResult todayResult) {
// 打印日志
String tag = todayResult.getTodayTime() + "执行次数:";
String collectionString = CollectionString.getCollectionString(tag, todayResult.getList());
System.out.println(collectionString);
} }
} }
...@@ -49,7 +49,7 @@ public class LogInfoVo extends BaseVo { ...@@ -49,7 +49,7 @@ public class LogInfoVo extends BaseVo {
* 接口处理状态,是否有异常 * 接口处理状态,是否有异常
*/ */
@ApiModelProperty(notes = "执行状态: -1表示执行中,0-表示失败,1表示成功", required = true, example = "0") @ApiModelProperty(notes = "执行状态: -1表示执行中,0-表示失败,1表示成功", required = true, example = "0")
private int status = STATUS_WAIT; private volatile int status = STATUS_WAIT;
/** /**
* 开始时间 * 开始时间
*/ */
...@@ -59,12 +59,12 @@ public class LogInfoVo extends BaseVo { ...@@ -59,12 +59,12 @@ public class LogInfoVo extends BaseVo {
* 结束时间 * 结束时间
*/ */
@ApiModelProperty(notes = "结束时间: 单位(毫秒)") @ApiModelProperty(notes = "结束时间: 单位(毫秒)")
private long end = System.currentTimeMillis(); private long end = 0;
/** /**
* 使用时间 * 使用时间
*/ */
@ApiModelProperty(notes = "执行耗时: 单位(毫秒)", required = true, example = "20") @ApiModelProperty(notes = "执行耗时: 单位(毫秒)", required = true, example = "20")
private int useTime; private long useTime;
/** /**
* 创建时间 * 创建时间
*/ */
...@@ -75,6 +75,20 @@ public class LogInfoVo extends BaseVo { ...@@ -75,6 +75,20 @@ public class LogInfoVo extends BaseVo {
*/ */
@ApiModelProperty(notes = "是否记录日志") @ApiModelProperty(notes = "是否记录日志")
private boolean logFlag; private boolean logFlag;
/**
* 是否已处理
*/
@ApiModelProperty(notes = "是否已处理")
private Handle handle;
/**
* 判断是否首次处理
*
* @return 返回值
*/
public synchronized boolean isFirstHandle() {
return this.handle == null;
}
public String getLogId() { public String getLogId() {
return logId; return logId;
...@@ -156,11 +170,11 @@ public class LogInfoVo extends BaseVo { ...@@ -156,11 +170,11 @@ public class LogInfoVo extends BaseVo {
this.end = end; this.end = end;
} }
public int getUseTime() { public long getUseTime() {
return useTime; return useTime;
} }
public void setUseTime(int useTime) { public void setUseTime(long useTime) {
this.useTime = useTime; this.useTime = useTime;
} }
...@@ -179,4 +193,36 @@ public class LogInfoVo extends BaseVo { ...@@ -179,4 +193,36 @@ public class LogInfoVo extends BaseVo {
public void setLogFlag(boolean logFlag) { public void setLogFlag(boolean logFlag) {
this.logFlag = logFlag; this.logFlag = logFlag;
} }
public Handle getHandle() {
return handle;
}
public void setHandle(Handle handle) {
this.handle = handle;
}
public static class Handle {
private final int level;
private final long useTime;
private final boolean isLog;
public Handle(int level, long useTime, boolean isLog) {
this.level = level;
this.useTime = useTime;
this.isLog = isLog;
}
public int getLevel() {
return level;
}
public long getUseTime() {
return useTime;
}
public boolean isLog() {
return isLog;
}
}
} }
...@@ -21,25 +21,14 @@ import static com.yanzuoguang.log.LogInfoVo.STATUS_WAIT; ...@@ -21,25 +21,14 @@ import static com.yanzuoguang.log.LogInfoVo.STATUS_WAIT;
*/ */
@Component @Component
public class LogLocal implements ThreadNext.Next, InitializingBean { public class LogLocal implements ThreadNext.Next, InitializingBean {
/**
* 一个请求最多保留60分钟
*/
public static final int CLEAR_CACHE = 60 * 60;
/**
* 超时状态
*/
public static final String MAX_TIME = "MAX_TIME";
public static final String MAX_TIME_NAME = "执行超时";
/**
* 日志基础
*/
private final LogBase logBase; private final LogBase logBase;
private final CloudConfig cloudConfig; private final CloudConfig cloudConfig;
private final List<LogFilter> logFilters; private final List<LogFilter> logFilters;
private final LogCountTime logCountTime; private final LogCountTime logCountTime;
/** /**
* 缓存队列 * 缓存队列,一个请求最多保留60分钟
*/ */
public static final int CLEAR_CACHE = 60 * 60;
protected volatile MemoryCache<Timeout<LogInfoVo>> cache = new MemoryCache<>(CLEAR_CACHE); protected volatile MemoryCache<Timeout<LogInfoVo>> cache = new MemoryCache<>(CLEAR_CACHE);
public LogLocal(LogBase logBase, CloudConfig cloudConfig, List<LogFilter> logFilters, LogCountTime logCountTime) { public LogLocal(LogBase logBase, CloudConfig cloudConfig, List<LogFilter> logFilters, LogCountTime logCountTime) {
...@@ -71,28 +60,23 @@ public class LogLocal implements ThreadNext.Next, InitializingBean { ...@@ -71,28 +60,23 @@ public class LogLocal implements ThreadNext.Next, InitializingBean {
* @param log 日志对象 * @param log 日志对象
*/ */
public void result(LogInfoVo log) { public void result(LogInfoVo log) {
if (log == null || StringHelper.isEmpty(log.getLogId())) { // 日志不存在或已处理
if (log == null || StringHelper.isEmpty(log.getLogId()) || cache.get(log.getLogId()) == null) {
return; return;
} }
Timeout<LogInfoVo> timeout; // 获取是否已处理
// 判断是否延时结果 boolean isWait = log.getStatus() == STATUS_WAIT;
boolean isMaxTime = log.getStatus() == STATUS_WAIT; if (!isWait) {
if (isMaxTime) { cache.remove(log.getLogId());
timeout = cache.get(log.getLogId());
} else {
timeout = cache.remove(log.getLogId());
} }
// 日志请求不记录,防止死循环递归
boolean isLog = isLog(log.getTag(), log.getUrl());
// 全路径
String fullUrl = String.format("%s:%s", tag, url);
// 执行时间
long time = System.currentTimeMillis() - log.getStart();
// 记录请求时间 // 记录请求时间
logCountTime.finish(log); logCountTime.finish(log);
// 日志详情请求不记录,防止死循环递归
boolean isLog = isLog(log.getTag(), log.getUrl());
if (isLog) {
logBase.addLog(log); logBase.addLog(log);
} }
}
/** /**
...@@ -125,16 +109,25 @@ public class LogLocal implements ThreadNext.Next, InitializingBean { ...@@ -125,16 +109,25 @@ public class LogLocal implements ThreadNext.Next, InitializingBean {
*/ */
@Override @Override
public boolean next() { public boolean next() {
// 正在处理的任务
List<LogInfoVo> notHandles = new ArrayList<>();
Collection<Timeout<LogInfoVo>> values = cache.getValues(); Collection<Timeout<LogInfoVo>> values = cache.getValues();
for (Timeout<LogInfoVo> timeout : values) { for (Timeout<LogInfoVo> timeout : values) {
if (timeout == null) { if (timeout == null) {
continue; continue;
} }
LogInfoVo log = timeout.getData();
boolean isLog = isLog(log.getTag(), log.getUrl());
if (isLog) {
notHandles.add(log);
}
// 判断是否达到超时时间 // 判断是否达到超时时间
if (timeout.isMaxTime(this.cloudConfig.getLogTimeMax(), this.cloudConfig.getLogTimeSplit())) { if (timeout.isMaxTime(this.cloudConfig.getLockTime(), this.cloudConfig.getLogTimeSplit())) {
this.result(timeout.getData()); this.result(log);
} }
} }
// 通知正在处理中的任务队列
logBase.notifyNotHandle(notHandles);
return true; return true;
} }
......
...@@ -10,6 +10,7 @@ public class LogUrlCountVo { ...@@ -10,6 +10,7 @@ public class LogUrlCountVo {
private final Object lockFinish = new Object(); private final Object lockFinish = new Object();
private volatile String url; private volatile String url;
private volatile int level;
private volatile int startCount; private volatile int startCount;
private volatile int endCount; private volatile int endCount;
private volatile int errorCount; private volatile int errorCount;
...@@ -18,18 +19,13 @@ public class LogUrlCountVo { ...@@ -18,18 +19,13 @@ public class LogUrlCountVo {
private volatile long minTime = Long.MAX_VALUE; private volatile long minTime = Long.MAX_VALUE;
private volatile long maxTime; private volatile long maxTime;
public LogUrlCountVo(String url) { public LogUrlCountVo(String url, int level) {
this.url = url; this.url = url;
} }
public void addStart() {
synchronized (this.lockStart) {
this.startCount++;
}
}
public void addFinish(long time, boolean isLog) { public void addFinish(long time, boolean isLog) {
synchronized (lockFinish) { synchronized (lockFinish) {
this.startCount++;
this.endCount++; this.endCount++;
if (isLog) { if (isLog) {
this.errorCount++; this.errorCount++;
...@@ -41,6 +37,18 @@ public class LogUrlCountVo { ...@@ -41,6 +37,18 @@ public class LogUrlCountVo {
} }
} }
public void subFinish(long time, boolean isLog) {
synchronized (lockFinish) {
this.startCount--;
this.endCount--;
if (isLog) {
this.errorCount--;
}
this.totalTime -= time;
this.avgTime = this.totalTime / this.endCount;
}
}
public String getUrl() { public String getUrl() {
return url; return url;
} }
...@@ -49,6 +57,15 @@ public class LogUrlCountVo { ...@@ -49,6 +57,15 @@ public class LogUrlCountVo {
this.url = url; this.url = url;
} }
public int getLevel() {
return level;
}
public void setLevel(int level) {
this.level = level;
}
public int getStartCount() { public int getStartCount() {
return startCount; return startCount;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment