最近在学习微服务框架Spring Cloud,把自己小项目中的邮件相关模块拆分出来单独构建了一个通知中心微服务,以后发送邮件,扩展短信通知等就可以在这个微服务中单独扩展了。
本来想着把系统异常也作为消息发送给通知中心微服务,但是感觉代码会很繁琐,虽然SpringBoot有统一异常管理方式,但也并不是真的所有异常都能通过这种方式处理。
然后发现slf4j可以通过配置xml配置增加appender来将ERROR级别的日志发送给指定的邮箱。
如下是完整的配置
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="60 seconds" debug="false">
<contextName>logback</contextName>
<property name="log.path" value="${LOG_PATH:-.}"/>
<springProperty scope="context" name="appName" source="spring.application.name" defaultValue="ApplicationName"/>
<springProperty scope="context" name="applicationStack" source="application.stack" defaultValue="beta"/>
<springProperty scope="context" name="smtpHost" source="spring.mail.host"/>
<springProperty scope="context" name="smtpPort" source="spring.mail.port"/>
<springProperty scope="context" name="mailFrom" source="spring.mail.username"/>
<springProperty scope="context" name="username" source="spring.mail.username"/>
<springProperty scope="context" name="mailTo" source="tendency.system.emails"/>
<springProperty scope="context" name="password" source="spring.mail.password"/>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<!-- encoder默认配置为PartternLayoutEncoder -->
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<charset>UTF-8</charset>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} -
%msg%n</pattern>
</encoder>
</appender>
<appender name="logfile"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}/server.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${log.path}/server_%d{yyyy-MM-dd}.%i.log
</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy
class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>10MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<maxHistory>10</maxHistory>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50}
- %msg%n</pattern> -->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level - %msg%n</pattern>
</encoder>
</appender>
<appender name="transaction_file"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}/transaction.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${log.path}/transaction_%d{yyyy-MM-dd}.%i.log
</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy
class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>10MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<maxHistory>10</maxHistory>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50}
- %msg%n</pattern> -->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level - %msg%n</pattern>
</encoder>
</appender>
<appender name="MAIL" class="ch.qos.logback.classic.net.SMTPAppender">
<smtpHost>${smtpHost}</smtpHost>
<smtpPort>${smtpPort}</smtpPort>
<username>${username}</username>
<password>${password}</password>
<SSL>true</SSL>
<asynchronousSending>true</asynchronousSending>
<to>${mailTo}</to>
<from>${mailFrom}</from>
<subject>${appName}-[ERROR]</subject>
<layout class="ch.qos.logback.classic.html.HTMLLayout"/>
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>ERROR</level>
</filter>
</appender>
<logger name="com.eee" level="INFO" additivity="false">
<appender-ref ref="transaction_file" />
<appender-ref ref="STDOUT" />
<appender-ref ref="MAIL"/>
</logger>
<logger name="com.eee" level="DEBUG" additivity="false">
<appender-ref ref="logfile" />
<appender-ref ref="transaction_file" />
<appender-ref ref="STDOUT" />
<appender-ref ref="MAIL"/>
</logger>
<root level="ERROR">
<appender-ref ref="STDOUT" />
<appender-ref ref="logfile" />
<appender-ref ref="MAIL"/>
</root>
<logger name="org.mybatis" level="INFO" additivity="true">
<appender-ref ref="STDOUT"/>
<appender-ref ref="logfile"/>
<appender-ref ref="MAIL"/>
</logger>
</configuration>
主要涉及到的配置如下。通过springProperty来引用application.properties中配置的邮箱配置。
<springProperty scope="context" name="appName" source="spring.application.name" defaultValue="ApplicationName"/>
<springProperty scope="context" name="applicationStack" source="application.stack" defaultValue="beta"/>
<springProperty scope="context" name="smtpHost" source="spring.mail.host"/>
<springProperty scope="context" name="smtpPort" source="spring.mail.port"/>
<springProperty scope="context" name="mailFrom" source="spring.mail.username"/>
<springProperty scope="context" name="username" source="spring.mail.username"/>
<springProperty scope="context" name="mailTo" source="tendency.system.emails"/>
<springProperty scope="context" name="password" source="spring.mail.password"/>
<appender name="MAIL" class="ch.qos.logback.classic.net.SMTPAppender">
<smtpHost>${smtpHost}</smtpHost>
<smtpPort>${smtpPort}</smtpPort>
<username>${username}</username>
<password>${password}</password>
<SSL>true</SSL>
<asynchronousSending>true</asynchronousSending>
<to>${mailTo}</to>
<from>${mailFrom}</from>
<subject>${appName}-[ERROR]</subject>
<layout class="ch.qos.logback.classic.html.HTMLLayout"/>
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>ERROR</level>
</filter>
</appender>
image.png
如下图是收到邮件的效果图,还不错吧,哈哈,都给格式化好了
image.png