mxcsdn 2020-05-27
先引入jar包
<dependency> <groupId>javax.activation</groupId> <artifactId>activation</artifactId> <version>1.1.1</version> </dependency> <dependency> <groupId>javax.mail</groupId> <artifactId>mail</artifactId> <version>1.4.7</version> </dependency>
log4j2.xml配置,放入 appenders 标签里面
<SMTP name="Mailer" subject="错误日志" to="" from="" smtpHost="smtp.qq.com" timeOut="1000" smtpDebug="false" smtpUsername="1030872042" smtpPassword="spcggsezcwdxbehh" bufferSize="1024"> <ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/> </SMTP> <Async name="AsyncMailer" > <AppenderRef ref="Mailer"/> </Async>
这里说下 smtpPassword不是你邮箱密码,
qq邮箱上方设置--》账户, 拉到下方,把什么IMAP POP3 管他是啥都开启, 然后生成授权码,就是smtpPassword的值
再在log4j2.xml 文件加上
<AppenderRef ref="AsyncMailer" level="ERROR"/> 这句
基本完事,注意:邮件只会发送log.error()输出的内容,而且邮箱的邮件 不是随便发的 有数量限制,比如每天上限,每分钟上限多少封,超了直接就报错,连接被拒绝,这么一限制感觉没啥意思了。这里引出来一个问题,比如我想警告的异常是那种我根本不知道的,未知的运行时异常,怎么办呢? 比如什么sql执行的异常,空指针什么的,我要是知道我也不会打印什么log.error啊 我直接处理了。这就扯出来 全局异常处理了,@RestControllerAdvice @ExceptionHandler直接我就再里面来了这么个方法,别说还真可以, 随便找个方法来个 1/0, 邮件到位。 但是总感觉不对,我不能啥异常都抓啊,还是得细分指定异常,而且我只想检测某个service,这怎么整?就想到一个东西@Aspect, 直接写个切面类,来个@AfterThrowing, 这玩意是不是比上面那个好用?
@AfterThrowing(throwing="ex", pointcut="execution(* pdream.demo.service.impl.*.*(..))") public void doRecoveryActions(Throwable ex) { System.out.println("目标方法中抛出的异常:" + ex); log.error("异常来了..."); }
还有个问题,怎么控制邮件频率, 不能频繁发,太频繁在一段时间内只要发邮件就会报错。