spring boot logback配置异常发送邮件

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();
//    }
}

以上便是我的配置心得 如有不对之处和不懂之处还请留言指正,多多交流

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值