spring boot logback配置异常发送邮件
最近在做小程序项目,自行创建的springboot框架,完成以后决定加入一个发生异常自动发送邮件的功能,遂百度中查阅,谁知坑很深,很简单的配置几番尝试最终才搞定.现将自己整理的超简单方法分享,希望能够帮助到正在研究此项功能的同行.
1.由于springboot自带了logback等jar包 所以基于springboot框架想实现此功能只需要导入一个mail依赖即可,过多引入反而会各种冲突,(我被坑惨了)其他框架如mvc等还需正常导入相关的几个依赖,具体百度logback配置异常邮件即可参考,除了jar依赖部分,剩下的都是通用的
pom依赖加入:
<dependency>
<groupId>javax.mail</groupId>
<artifactId>mail</artifactId>
<version>1.4.7</version>
</dependency>
2.建立logback文件 ,我的项目配置文件放在resources 然后在springboot的yml配置文件中配置相关 引入logback的配置文件
我的yml配置
logging:
config: classpath:logback.xml #这里引入logbacxk配置文件 已经配置过logback的忽略
level:
root: info
debug: true
然后建立logback的xml的配置文件
logback.xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!-- 默认的一些设置 -->
<include resource="org/springframework/boot/logging/logback/defaults.xml" />
<!-- 日志文件变量 -->
<property name="LOG_FILE" value="${LOG_FILE:-${LOG_PATH:-${LOG_TEMP:-${java.io.tmpdir:-/tmp}}}/spring.log}"/>
<!-- 控台配置 -->
<include resource="org/springframework/boot/logging/logback/console-appender.xml" />
<!-- 文件配置 -->
<include resource="org/springframework/boot/logging/logback/file-appender.xml" />
<!-- 邮件配置 -->
<include resource="appender.xml" />
<root level="INFO">
<appender-ref ref="CONSOLE" />
<appender-ref ref="FILE" />
<appender-ref ref="MAIL"/>
</root>
<!-- 打印sql语句用 -->
<!-- <logger name="com.yzf.golf.mapper" level="DEBUG"/> -->
</configuration>
在同目录建立一个email的配置文件 不喜欢多弄个文件的 可以把两个配置文件合并写在一起
这里我使用的是qq邮箱发送邮件 需要将相应的邮箱smtp服务开启 并且生成授权码 填到password处
smtpHost smtp服务地址 smtpPort smtp服务端口 mailFrom username 填你用来发送邮件的邮箱账号 最好保持一致
mailTo 要发送给的邮箱 多个用逗号隔开 password 填邮箱服务的授权码
!!!password 不是密码 是授权码 from 和 username 要一致 不然会出现发送无效的情况!
同时如果各项设置都正常就是无法发送邮件可以尝试修改端口号 我的qq邮箱就是 改成了587端口才能正常发送
appender.xml
<?xml version="1.0" encoding="UTF-8"?>
<included>
<!--邮件设置-->
<property name="smtpHost" value="smtp.qq.com"/>
<property name="smtpPort" value="587"/>
<property name="mailFrom" value="xxxx@qq.com"/>
<property name="username" value="xxxx@qq.com"/>
<property name="mailTo" value="xxx@xx.com,xxx@xx.com"/>
<property name="password" value="pqijwowwqqvwbgcd"/>
<property name="SSL" value="false"/>
<property name="mailSubject" value="高尔夫小程序异常信息"/>
<appender name="MAIL" class="ch.qos.logback.classic.net.SMTPAppender">
<smtpHost>${smtpHost}</smtpHost>
<smtpPort>${smtpPort}</smtpPort>
<username>${username}</username>
<password>${password}</password>
<SSL>${SSL}</SSL>
<asynchronousSending>false</asynchronousSending>
<to>${mailTo}</to>
<from>${mailFrom}</from>
<subject>${mailSubject}</subject>
<layout class="ch.qos.logback.classic.html.HTMLLayout">
<!-- 这里配置的是邮件表格的形式 跟截图的邮件格式是一样 其实不加这一块也是样式也是一样的 但是可以自己研究自定义样式-->
<Pattern>%date%level%thread%logger{0}%line%message</Pattern>
</layout>
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>ERROR</level>
</filter>
</appender>
</included>
以上配置完成后启动一下项目 如果配置文件没有问题是可以正常启动项目的 如果报logback配置错误无法其中之类的 请仔细排查配置文件是否写错 或引入错误
现在我们就具备了发送异常邮件的功能 但是还缺少一个至关重要的环节 就是发生异常后如何触发并发送邮件
这里我的思路是新建一个全局异常捕获类 用来捕捉异常 然后发送邮件 里面有一段是用来从quest中抓取客户端ip的方法 各位可以忽略 重点是 logger.error(e.getMessage(), e); 从Exception 中获取异常内容 并发送html格式的邮件
/**
*
*/
package com.yzf.golf.controller;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import com.yzf.golf.util.IpAddrUtil;
/**
* @ClassName: MyExceptionHandler
* @author 于占峰
* @Description: TODO(全局异常捕捉并发送邮件通知)
* @date 2019年8月30日 上午9:48:32
*/
@ControllerAdvice
public class MyExceptionHandler {
private Logger logger = LoggerFactory.getLogger(MyExceptionHandler.class);
public static final String ERROR_VIEW = "error";
@ExceptionHandler(value = Exception.class)
public void errorHandler(HttpServletRequest request, HttpServletResponse response, Exception e) throws Exception {
e.printStackTrace();
String ip = IpAddrUtil.getRequestIpAddr(request);
// ip = IpAddrUtil.GetIpAddr(ip);
System.out.println("开始发送异常邮件+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++");
System.out.println(e.getMessage());
logger.error("ip:"+ ip +e.getMessage(), e);
System.out.println("发送完成+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++");
}
}
完成以上步骤我们就大功告成了
当项目发生异常时会被异常捕捉类捕获 然后获取详细信息并发送邮件
具体深层实现方法并未了解 如有比较理解的道友还请多多交流
现在可以尝试手动触发异常看看是否发送邮件
贴一个我的异常邮件效果
这里贴一个自主触发的控制层 可以通过地址栏请求触发异常,在其他网友的帖子内找到的 再次感谢无私的网友们~!!!
package com.yzf.golf.controller;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import java.util.Random;
@RequestMapping("/app")
@RestController
public class appController {
private Logger logger = LoggerFactory.getLogger(appController.class);
@RequestMapping
public String selectList() {
boolean flag = new Random().nextBoolean();
if (flag) {
throw new RuntimeException("测试报错");
} else {
return "正常返回 当前时间:" + System.currentTimeMillis();
}
}
// @ExceptionHandler
// @ResponseBody
// public String exceptionHandler(Exception e) {
// System.out.println("开始发送异常邮件+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++");
// System.out.println(e.getMessage());
// logger.error(e.getMessage(), e);
// System.out.println("发送完成");
// return e.getMessage();
// }
}
以上便是我的配置心得 如有不对之处和不懂之处还请留言指正,多多交流