当前位置: 首页 > 科技观察

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

时间:2023-03-21 23:40:21 科技观察

系统异常。第一部分是通过在全局异常中调用发送电子邮件的处理器代码来发送电子邮件。总觉得没有那么优雅。本文是通过扩展logback的日志插件来发送邮件,处理err级别的日志异常信息。通过本文的学习,你可以掌握如何扩展logback的日志类来达到你不可告人的目的。代码直接在下面。首先自定义一个日志处理类wlcLogLogbackAppender。导入ch.qos.logback.classic.spi.LoggingEvent;导入ch.qos.logback.classic.spi.ThrowableProxy;导入ch.qos.logback.core.AppenderBase;导入com.handler.WlcAsyncHandler;导入com.utils.SpringContextUtil;importorg.springframework.web.context.request.RequestContextHolder;importorg.springframework.web.context.request.ServletRequestAttributes;importjavax.servlet.http.HttpServletRequest;importjava.util.Objects;/***描述:自定义日志处理类
*时间:2021-07-0111:11
*作者:IT学习场*/publicclasswlcLogLogbackAppenderextendsAppenderBase{@Overrideprotectedvoidappend(LoggingEventeventObject){if(eventObjectinstanceofLoggingEvent){LoggingEventloggingEvent=(LoggingEvent)eventObject;//拿到ThrowableProxyThrowableProxythrowableProxy=(ThrowableProxy)loggingEvent.getThrowableProxy();if(Objects.nonNull(throwableProxy)){//获取throwable顶级异常常Throwablethrowable=throwableProxy.getThrowable();//获取日志的msgStringformattedMessage=loggingEvent.getFormattedMessage();//获取请求请求HttpServletRequestrequest=((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest();//获取spring的spring.mail.enable属性值。大家也可以根据自己的想法玩一下下面的逻辑。StringmailEnableProperty=SpringContextUtil.getEnvironmentProperty("spring.mail.enable");mailEnableProperty=(mailEnableProperty==null)?“假”:邮件启用属性;booleanmailEnable=Boolean.valueOf(mailEnableProperty);if(mailEnable){//获取邮件处理类WlcAsyncHandleremailHandler=SpringContextUtil.getBean(WlcAsyncHandler.class);emailHandler.handle(formattedMessage,throwable,request);}}}super.doAppend(eventObject);}}自定义日志处理类就完成了,剩下的就是在logback-spring.xml中进行配置,配置级别为error级别%d{ss.SSS}%highlight(%-5level)%blue(%-30logger{30}:%-4line)%thread%green(%-18X{LOG_ID})%msg%n${PATH}/trace/trace.log${PATH}/trace/trace.%d{yyyy-MM-dd}.%i.log10MBtrue15%d{yyyy-MM-ddHH:mm:ss.SSS}%-5level%-50logger{50}:%-4line%green(%-18X{LOG_ID})%msg%n${PATH}/error/error.log${PATH}/error/error.%d{yyyy-MM-dd}.%i.log10MBtrue15<布局><模式>%d{yyyy-MM-ddHH:mm:ss.SSS}%-5level%-50logger{50}:%-4line%green(%-18X{LOG_ID})%msg%n错误ACCEPTDENYERRORACCEPTDENY<根级别="INFO">当然是因为:当判断异常不为空时,如果要进入判断,需要在日志中输出日志,注入Throwable如下:必须使用log.error("Thisisalogmsg",e)。这样:ThrowableProxythrowableProxy=(ThrowableProxy)loggingEvent.getThrowableProxy();throwableProxy不等于null。比如log.error("Thisisalogmsg")。throwableProxy等于null。这样自定义一个日志处理类wlcLogLogbackAppender就会生效。您可以使用wlcLogLogbackAppender获取日志信息并执行您想要的操作。比如我这边就是在里面发邮件,当然你什么都可以。发送电子邮件的代码将不会共享。有兴趣的可以看看之前的文章。