Commit 887fd4bc authored by data-赵 玉龙's avatar data-赵 玉龙

修改错误信息的传输方式,方便测试环境操作

parent 32c3a47f
package cn.quantgroup.dinglog.config;
import cn.quantgroup.dinglog.properties.DingTalkWebHookProperties;
import cn.quantgroup.dinglog.service.DingTalkSendMsgService;
import cn.quantgroup.dinglog.service.impl.DingTalkSendMsgServiceImpl;
import cn.quantgroup.dinglog.util.LogErrorSendMsgUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* @Describe:
* @Created by tangfeng 2020-07-07 19:56
*/
@Configuration
//@ConfigurationProperties(prefix = "dinglog.hooke.logerror")
public class DingTalkHookLogErrorConfig {
private static String url;
private static Boolean enable = false;
/**
* 单线程发送,最大条数200条,超过废弃
*/
@Value("${dinglog.hooke.logerror.enable:false}")
public void setDomain(String enableString){
if(enableString==null){
return;
}
if("true".equals(enableString)){
enable = true;
}else{
enable = false;
}
}
@Value("${dinglog.hooke.logerror.url:http://127.0.0.1}")
public void setUrl(String url){
DingTalkHookLogErrorConfig.url = url;
}
public static Boolean isEnable(){
return enable;
}
public static void setEnable(boolean inEnable){
enable = inEnable;
}
public static String getUrl(){
return url;
}
}
......@@ -18,6 +18,9 @@ public class DingTalkLogbackParam {
private String markMsg;
private String collectUrl;
public boolean isSendMsg() {
return sendMsg;
}
......@@ -65,4 +68,12 @@ public class DingTalkLogbackParam {
public void setLogExStackTracePackage(String logExStackTracePackage) {
this.logExStackTracePackage = logExStackTracePackage;
}
public String getCollectUrl() {
return collectUrl;
}
public void setCollectUrl(String collectUrl) {
this.collectUrl = collectUrl;
}
}
......@@ -36,21 +36,20 @@ public class DingTalkLogbackSendMsg {
}
String accessToken = dingTalkLogbackParam.getWebHookAccessToken();
if (StringUtils.isEmpty(accessToken)) {
base.addInfo("No dingTalk accessToken for the appender named [" + appenderName + "].");
String collect_url = dingTalkLogbackParam.getCollectUrl();
if (StringUtils.isEmpty(accessToken) && StringUtils.isEmpty(collect_url)) {
return;
}
try {
//按照格式化日志形式输出
if (dingTalkLogbackParam.isLayoutLog() && encoder.getLayout() != null) {
String layoutLog = encoder.getLayout().doLayout(event);
if (StringUtils.isNotEmpty(dingTalkLogbackParam.getMarkMsg())) {
layoutLog = dingTalkLogbackParam.getMarkMsg().concat("---").concat(layoutLog);
}
DingTalkSendMsgUtil.sendTextMsg(layoutLog, accessToken);
LogErrorSendMsgUtil.sendMsg(layoutLog);
LogErrorSendMsgUtil.sendMsg(layoutLog, collect_url);
return;
}
......@@ -69,10 +68,10 @@ public class DingTalkLogbackSendMsg {
if (stackTraceElementProxyArray != null && stackTraceElementProxyArray.length > 0) {
for (int i = 0; i < stackTraceElementProxyArray.length; i++) {
StackTraceElementProxy st = stackTraceElementProxyArray[i];
if (StringUtils.isNotEmpty(dingTalkLogbackParam.getLogExStackTracePackage()) && st.toString().contains(dingTalkLogbackParam.getLogExStackTracePackage()) ) {
if(st.getStackTraceElement()!=null
&&st.getStackTraceElement().getFileName()!=null&&st.getStackTraceElement().getFileName().contains("generated")
&&st.getStackTraceElement().getClassName()!=null&&st.getStackTraceElement().getClassName().contains("BySpringCGLIB")){
if (StringUtils.isNotEmpty(dingTalkLogbackParam.getLogExStackTracePackage()) && st.toString().contains(dingTalkLogbackParam.getLogExStackTracePackage())) {
if (st.getStackTraceElement() != null
&& st.getStackTraceElement().getFileName() != null && st.getStackTraceElement().getFileName().contains("generated")
&& st.getStackTraceElement().getClassName() != null && st.getStackTraceElement().getClassName().contains("BySpringCGLIB")) {
continue;
}
sbExMsg.append(st.toString()).append("\n");
......@@ -87,7 +86,7 @@ public class DingTalkLogbackSendMsg {
message = dingTalkLogbackParam.getMarkMsg().concat("---").concat(message);
}
DingTalkSendMsgUtil.sendTextMsg(message, accessToken);
LogErrorSendMsgUtil.sendMsg(message);
LogErrorSendMsgUtil.sendMsg(message, collect_url);
} catch (Exception e) {
base.addInfo("ding talk logback send msg error:{}", e);
}
......
......@@ -41,7 +41,7 @@ public class DingTalkAppenderUnSync extends UnsynchronizedAppenderBase<LoggingEv
@Override
protected void append(LoggingEvent event) {
DingTalkLogbackSendMsg.sendMsg(this,encoder, event, name, dingTalkLogbackParam);
DingTalkLogbackSendMsg.sendMsg(this, encoder, event, name, dingTalkLogbackParam);
}
......
......@@ -22,13 +22,16 @@ public class DingTalkSendMsgUtil {
* 发送json串消息
*/
public static boolean sendTextMsg(String content, String accessToken) {
return sendTextMsg(content,null, accessToken, null);
if (accessToken != null) {
return sendTextMsg(content, null, accessToken, null);
} else {
return false;
}
}
public static boolean sendTextMsgAt(String content,String mobiles, String accessToken) {
public static boolean sendTextMsgAt(String content, String mobiles, String accessToken) {
return sendTextMsg(content,mobiles, accessToken, null);
return sendTextMsg(content, mobiles, accessToken, null);
}
public static boolean sendTextMsg(String content, String mobiles, String accessToken, String keyWords) {
......@@ -47,7 +50,7 @@ public class DingTalkSendMsgUtil {
request.setMsgtype("text");
request.setText(text);
if (StringUtils.isNotEmpty(mobiles)){
if (StringUtils.isNotEmpty(mobiles)) {
OapiRobotSendRequest.At at = new OapiRobotSendRequest.At();
at.setAtMobiles(Arrays.asList(mobiles.split(",")));
// isAtAll类型如果不为Boolean,请升级至最新SDK
......
package cn.quantgroup.dinglog.util;
import ch.qos.logback.classic.spi.IThrowableProxy;
import ch.qos.logback.classic.spi.StackTraceElementProxy;
import cn.quantgroup.dinglog.config.DingTalkHookLogErrorConfig;
import com.alibaba.fastjson.JSON;
import com.taobao.api.Constants;
import com.taobao.api.internal.util.HttpResponseData;
import com.taobao.api.internal.util.WebV2Utils;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import java.io.IOException;
import java.time.LocalDateTime;
......@@ -29,106 +24,103 @@ import java.util.concurrent.TimeUnit;
*/
public class LogErrorSendMsgUtil {
static Logger logger = LoggerFactory.getLogger(LogErrorSendMsgUtil.class);
static Logger logger = LoggerFactory.getLogger(LogErrorSendMsgUtil.class);
static ThreadPoolExecutor executor =
new ThreadPoolExecutor(1, 1, 5l, TimeUnit.MINUTES, new ArrayBlockingQueue<>(200),
new ThreadFactory() {
public Thread newThread(Runnable r) {
return new Thread(r, "钉钉log错误消息");
}
}, new ThreadPoolExecutor.DiscardOldestPolicy());
static ThreadPoolExecutor executor =
new ThreadPoolExecutor(1,1,5l, TimeUnit.MINUTES,new ArrayBlockingQueue<>(200),
new ThreadFactory(){
public Thread newThread(Runnable r) {
return new Thread(r, "钉钉log错误消息");
}},new ThreadPoolExecutor.DiscardOldestPolicy());
public static void sendMsg(String msg, String url, Throwable e) {
public static void sendMsg(String msg,Throwable e){
if(msg==null) {
return ;
}
if(!DingTalkHookLogErrorConfig.isEnable()){
if (msg == null) {
return;
}
if(e!=null){
msg = msg +"\n"+getStackTraceElementMessage(e);
if (e != null) {
msg = msg + "\n" + getStackTraceElementMessage(e);
}
sendMsg(msg);
sendMsg(msg, url);
}
public static String getStackTraceElementMessage(Throwable ex){
public static String getStackTraceElementMessage(Throwable ex) {
int index = 0;
String errorMessage = "";
StackTraceElement[] stackTraceElements = ex.getStackTrace();
StringBuilder sb = new StringBuilder();
sb.append(ex.fillInStackTrace()+"\n");
for(StackTraceElement stackTraceElement:stackTraceElements){
if(index >3){
sb.append(ex.fillInStackTrace() + "\n");
for (StackTraceElement stackTraceElement : stackTraceElements) {
if (index > 3) {
return errorMessage;
}
try{
try {
String className = stackTraceElement.getClassName();
String fileName = stackTraceElement.getFileName();
if(className!=null&&className.contains("BySpringCGLIB")
&&fileName!=null&&fileName.contains("generated")){
if (className != null && className.contains("BySpringCGLIB")
&& fileName != null && fileName.contains("generated")) {
continue;
}
if(className==null||className.contains("quantgroup") || className.contains(".qg.")||
className.contains(".xyqb.")||className.contains(".lkb.")||
className.contains(".liangkebang.") ){
index ++;
String les[] = stackTraceElement.getClassName().split("\\.");
if (className == null || className.contains("quantgroup") || className.contains(".qg.") ||
className.contains(".xyqb.") || className.contains(".lkb.") ||
className.contains(".liangkebang.")) {
index++;
String les[] = stackTraceElement.getClassName().split("\\.");
// if(les.length>3){
// sb.append("*.").append(les[les.length-3]).append(".").append(les[les.length-2]).append(".").append(les[les.length-1]);
// }else{
sb.append(stackTraceElement.getClassName());
sb.append(stackTraceElement.getClassName());
// }
sb.append( "." + stackTraceElement.getMethodName() + "(" + stackTraceElement.getFileName() + ":"
sb.append("." + stackTraceElement.getMethodName() + "(" + stackTraceElement.getFileName() + ":"
+ stackTraceElement.getLineNumber() + ") \n");
errorMessage = sb.toString();
}
}catch (Exception e){
} catch (Exception e) {
}
}
return errorMessage;
}
public static void sendMsg(String msg, String url) {
if (url != null && url.trim().length() > 5) {
executor.execute(() -> {
//组装参数,准备发送
// long time = LocalDateTime.now().atZone(ZoneId.systemDefault()).toInstant().toEpochMilli();
String error_time = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss").format(LocalDateTime.now());
Map<String, String> params = new LinkedHashMap<>();
params.put("error_time", error_time);
String project_name = System.getProperty("@appId");
if (project_name == null) {
project_name = System.getProperty("sun.java.command");
String[] strings = project_name.split("\\.");
project_name = strings[strings.length - 1];
}
params.put("project_name", project_name);
params.put("env", System.getProperty("env"));
params.put("msg", msg);
HttpResponseData responseData = null;
logger.debug("发送错误信息 url={}, json={}", url, JSON.toJSONString(params));
try {
//不关心返回结果
responseData = WebV2Utils.doPost(url, params, Constants.CHARSET_UTF8,
1000, 1000);
} catch (IOException e) {
logger.error("访问killbugs发送异常,msg={}", e.getLocalizedMessage());
}
if (responseData.getBody() != null && responseData.getBody().contains("ok")) {
logger.info("项目名{},环境={},发送成功", project_name, System.getProperty("env"));
} else {
logger.info("项目名{},环境={}, 发送失败", project_name, System.getProperty("env"));
}
public static void sendMsg(String msg){
if(!DingTalkHookLogErrorConfig.isEnable()){
return;
});
}
executor.execute(()->{
//组装参数,准备发送
// long time = LocalDateTime.now().atZone(ZoneId.systemDefault()).toInstant().toEpochMilli();
String error_time = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss").format(LocalDateTime.now());
Map<String,String> params = new LinkedHashMap<>();
params.put("error_time",error_time );
String project_name = System.getProperty("@appId");
if(project_name == null){
project_name = System.getProperty("sun.java.command");
String[] strings = project_name.split("\\.");
project_name = strings[strings.length-1];
}
params.put("project_name",project_name);
params.put("env",System.getProperty("env"));
params.put("msg",msg);
HttpResponseData responseData = null;
logger.debug("发送错误信息 url={}, json={}",DingTalkHookLogErrorConfig.getUrl(),JSON.toJSONString(params));
try {
//不关心返回结果
responseData = WebV2Utils.doPost(DingTalkHookLogErrorConfig.getUrl(), params, Constants.CHARSET_UTF8,
1000, 1000);
} catch (IOException e) {
logger.error("访问killbugs发送异常,msg={}",e.getLocalizedMessage());
}
if(responseData.getBody()!=null&&responseData.getBody().contains("ok")){
logger.info("项目名{},环境={},发送成功",project_name,System.getProperty("env"));
}else{
logger.info("项目名{},环境={}, 发送失败",project_name,System.getProperty("env"));
}
});
}
......
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