阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

扩展logback日志来发送异常信息邮件

99次阅读
没有评论

共计 4713 个字符,预计需要花费 12 分钟才能阅读完成。

导读 这篇是通过扩展 logback 的日志插件来处理 err 级别的日志异常信息来发送邮件的,通过这篇的学习,可以掌握如何扩展 logback 的日志类,来实现自己不可告人的目的。

扩展 logback 日志来发送异常信息邮件

系统异常了,​​上篇​​是通过在全局异常中通过调用发送邮件的处理器代码进行邮件的发送,总是觉得还不那么优雅。

这篇是通过扩展 logback 的日志插件来处理 err 级别的日志异常信息来发送邮件的。

通过这篇的学习,可以掌握如何扩展 logback 的日志类,来实现自己不可告人的目的。

下面直接上代码。

首先自定义一个日志处理处理类 wlcLogLogbackAppender。

import ch.qos.logback.classic.spi.LoggingEvent;
import ch.qos.logback.classic.spi.ThrowableProxy;
import ch.qos.logback.core.AppenderBase;
import com.handler.WlcAsyncHandler;
import com.utils.SpringContextUtil;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletRequest;
import java.util.Objects;
/**
* 描述: 自定义日志处理类
* 时间: 2021-07-01 11:11
* 作者:IT 学习道场
*/
public class wlcLogLogbackAppender extends AppenderBase {
@Override
protected void append(LoggingEvent eventObject) {if(eventObject instanceof LoggingEvent){LoggingEvent loggingEvent = (LoggingEvent)eventObject;
// 拿到 ThrowableProxy
ThrowableProxy throwableProxy = (ThrowableProxy) loggingEvent.getThrowableProxy();
if (Objects.nonNull(throwableProxy)) {
// 获取 throwable 顶级异常
Throwable throwable = throwableProxy.getThrowable();
// 获取 log 的 msg
String formattedMessage = loggingEvent.getFormattedMessage();
// 获取请求 request
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder
.getRequestAttributes()).getRequest();
// 获取 spring 的 spring.mail.enable 属性值,下面的逻辑你也可以自己根据想法自己玩也行
String mailEnableProperty = SpringContextUtil.getEnvironmentProperty("spring.mail.enable");
mailEnableProperty = (mailEnableProperty == null) ? "false" : mailEnableProperty;
boolean mailEnable = Boolean.valueOf(mailEnableProperty);
if (mailEnable){
// 获取邮件的处理类
WlcAsyncHandler emailHandler = SpringContextUtil.getBean(WlcAsyncHandler.class);
emailHandler.handle(formattedMessage, throwable, request);
}
}
}
super.doAppend(eventObject);
}
}

自定义的日志处理类搞完了,剩下的就是在 logback-spring.xml 中配置下就行,配置级别是 error 级别。

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!-- 修改一下路径 -->
<property name="PATH" value="./log"></property>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<!-- <Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %highlight(%-5level) %blue(%-50logger{50}:%-4line) %thread %green(%-18X{LOG_ID}) %msg%n</Pattern>-->
<Pattern>%d{ss.SSS} %highlight(%-5level) %blue(%-30logger{30}:%-4line) %thread %green(%-18X{LOG_ID}) %msg%n</Pattern>
</encoder>
</appender>
<appender name="TRACE_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${PATH}/trace/trace.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<FileNamePattern>${PATH}/trace/trace.%d{yyyy-MM-dd}.%i.log</FileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>10MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<!-- 因为 FileNamePattern 配置规则是 yyyy-MM-dd,就是天,所以 maxHistory 代表多少天 -->
<cleanHistoryOnStart>true</cleanHistoryOnStart>
<!--maxHistory 生效必须加 <cleanHistoryOnStart>true</cleanHistoryOnStart>-->
<maxHistory>15</maxHistory>
</rollingPolicy>
<layout>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %-50logger{50}:%-4line %green(%-18X{LOG_ID}) %msg%n</pattern>
</layout>
</appender>
<appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${PATH}/error/error.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<FileNamePattern>${PATH}/error/error.%d{yyyy-MM-dd}.%i.log</FileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>10MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<cleanHistoryOnStart>true</cleanHistoryOnStart>
<maxHistory>15</maxHistory>
</rollingPolicy>
<layout>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %-50logger{50}:%-4line %green(%-18X{LOG_ID}) %msg%n</pattern>
</layout>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- 配置自定义的日志处理了 -->
<appender name="WlcLog" class="com.logback.wlcLogLogbackAppender">
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!--ERROR 级别调用 -->
<root level="ERROR">
<appender-ref ref="ERROR_FILE" />
<appender-ref ref="WlcLog" />
</root>
<root level="TRACE">
<appender-ref ref="TRACE_FILE" />
</root>
<root level="INFO">
<appender-ref ref="STDOUT" />
</root>
</configuration>

当然由于:

扩展 logback 日志来发送异常信息邮件

判断了异常不为空时,想要进去判断,就需要在 log 输出日志时,要注入 Throwable。

如下:

扩展 logback 日志来发送异常信息邮件

必须用 log.error(“ 这是一个日志 msg”, e)。

这样:

ThrowableProxy throwableProxy = (ThrowableProxy) loggingEvent.getThrowableProxy();

throwableProxy 就不等于 null。

像 log.error(“ 这是一个日志 msg”)。

throwableProxy 就等于 null。​

这样自定义一个日志处理处理类 wlcLogLogbackAppender 就生效了。

你可以 wlcLogLogbackAppender 在里面你可以拿到日志信息,做一些自己想做的事情。比如我这边就是在里面发送邮件,当然你可以做任何事。

阿里云 2 核 2G 服务器 3M 带宽 61 元 1 年,有高配

腾讯云新客低至 82 元 / 年,老客户 99 元 / 年

代金券:在阿里云专用满减优惠券

正文完
星哥玩云-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2024-07-25发表,共计4713字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中