一、发送钉钉工具类
public class WarnPushUtil extends UnsynchronizedAppenderBase<ILoggingEvent> {
private static String url = "钉钉机器人地址";
@Override
protected void append(ILoggingEvent event) {
try {
if (event.getLevel() == Level.ERROR) {
IThrowableProxy iThrowableProxy = event.getThrowableProxy();
StringBuilder sb = new StringBuilder();
if (iThrowableProxy != null && iThrowableProxy instanceof ThrowableProxy) {
ThrowableProxy throwableProxy = (ThrowableProxy) iThrowableProxy;
Throwable throwable = throwableProxy.getThrowable();
String throwableMsg = throwable.getMessage();
StackTraceElementProxy[] stackTraceElementProxy = iThrowableProxy.getStackTraceElementProxyArray();
sb.append(event.getMessage()).append("\n");
if (!StringUtils.isEmpty(throwableMsg)) {
sb.append(throwableMsg).append("\n");
}
int i = 0;
for (StackTraceElementProxy proxy : stackTraceElementProxy) {
//只打印40行的堆栈
if (i < 10) {
sb.append(proxy.getSTEAsString()).append("\n");
} else {
break;
}
i++;
}
} else {
sb.append(event.getMessage());
}
String msg = sb.toString();
if (!StringUtils.isEmpty(msg)) {
sendExceptionInfo(msg);
}
}
} catch (Exception e) {
System.out.println("防止死循环");
}
}
public void sendExceptionInfo(String msg) {
try {
Map ddMesMap = new HashMap();
Map contentMap = new HashMap();
contentMap.put("content", url +"knowledge异常明细:"+ msg);
ddMesMap.put("msgtype", "text");
ddMesMap.put("text", contentMap);
//技术群
post(url, JSON.toJSONString(ddMesMap));
} catch (Exception e) {
System.out.println("防止死循环");
}
}
/**
* 调用 API
*
* @param url
* @param body
* @return
*/
public static String post(String url, String body) {
HttpClient httpClient = new DefaultHttpClient();
HttpPost httpPost = new HttpPost(url);
try {
// 建立一个NameValuePair数组,用于存储欲传送的参数
httpPost.addHeader("Content-type",
"application/json; charset=utf-8");
httpPost.setHeader("Accept", "application/json");
httpPost.setEntity(new StringEntity(body, Charset.forName("UTF-8")));
HttpResponse response = httpClient.execute(httpPost);
int statusCode = response.getStatusLine().getStatusCode();
System.out.println("statusCode:" + statusCode);
if (statusCode != 200) {
System.out.println("Method failed:" + response.getStatusLine());
}
// Read the response body
body = EntityUtils.toString(response.getEntity());
} catch (IOException e) {
// 网络错误
} finally {
httpClient.getConnectionManager().shutdown();
((DefaultHttpClient) httpClient).close();
}
return body;
}
}
二、配置logback.xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!-- 日志最大的历史 30天 -->
<property name="maxHistory" value="30"/>
<property name="log_dir" value="/apache-tomcat-8.5.16" />
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<charset>UTF-8</charset>
<pattern>%date - %level [%logger:%line] - %msg%n%ex{5}</pattern>
</encoder>
</appender>
<appender name="DINGDING" class="com.xxx.WarnPushUtil">
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<logger name="io.grpc" level="info" additivity="false">
<appender-ref ref="STDOUT"/>
</logger>
<root level="info">
<appender-ref ref="DINGDING"/>
</root>
</configuration>
三、测试
@Controller
@RequestMapping("/beat")
public class BeatController {
private Logger logger = LoggerFactory.getLogger(BeatController.class);
@ResponseBody
@RequestMapping("")
public ResultBean check(){
System.out.println("living...........");
logger.error("出错了!");
return ResultBean.getSuccessBean().setCode("200");
}
}