项目场景:
项目场景:客户运营管理平台,异常后需要进行邮件通知到开发人员
问题描述:
使用了logback的异常发送邮件功能,但是发送出来的邮件内容都是html代码
<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>true</asynchronousSending>
<to>${mailTo}</to>
<from>${mailFrom}</from>
<subject>${environment}-[${HOSTNAME}]-${mailSubject}</subject>
<layout class="ch.qos.logback.classic.html.HTMLLayout"/>
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>ERROR</level>
</filter>
</appender>
<!-- 异步输出 -->
<appender name ="MAIL_ASYNC" class= "ch.qos.logback.classic.AsyncAppender">
<!-- 不丢失日志.默认的,如果队列的80%已满,则会丢弃TRACT、DEBUG、INFO级别的日志 -->
<discardingThreshold >0</discardingThreshold>
<!-- 更改默认的队列的深度,该值会影响性能.默认值为256 -->
<queueSize>50</queueSize>
<!-- Copy caller data to event 解决 日志输出使用 AsyncAppender 时,输出的文件行号信息是 ?:? -->
<includeCallerData>true</includeCallerData >
<!-- 添加附加的appender,最多只能添加一个 -->
<appender-ref ref="MAIL"/>
</appender>
下面是邮件发出来的内容,跟logbak官方提供的不一样,可读性很差,这肯定是不便于开发人员去定位问题的
原因分析:
因为多个项目都使用了相同的异常邮件通知方案,A项目可以正常发送,B项目发出来的就是html代码。考虑下以下几种可能引起的情况,1. jar冲突 2. 邮箱服务器进行了过滤(既然A项目可以那说明不是这个问题导致的),于是去看QQ邮箱发出来的正常邮箱和html代码的显示原文邮件,发现邮件的Content-Type不一样
Content-Type: text/plain; charset=UTF-8
这显然就导致邮件内容当普通文本显示了
解决方案:
启动2个项目,手动throw出来异常进行异常日志打印,进行断点调试, 去查看设置邮件 Content-Type的代码,发现了问题,A项目去构造Content-Type的时候,调用的底层方法为axiom-api.jar下的类,而且这个类的Content-Type写死了
正常的jar应该是下面的引用
于是把 axiom-api的jar引用直接删除,再发送异常邮件就显示正常了
事后思考:1. 遇到问题应该先使用排除法, 排除掉不可能的情况 2. 要学会使用查看第三方源代码的方法,去debug进行跟踪调试 3. 项目中引入的jar要有了解,避免冲突引起别的问题