Java非執行時異常提示
阿新 • • 發佈:2022-03-25
有時候專案裡面寫的try catch部分,無法通過全域性異常或者通過實現handlerExceptionResolver 來捕獲到。比如一些sql異常、空指標之類導致的內部錯誤。這時候可以通過日誌的級別來打印出來。實現程式碼如下
package com.gwm.lafeng.filter.log; import ch.qos.logback.classic.LoggerContext; import ch.qos.logback.classic.turbo.TurboFilter; import org.slf4j.LoggerFactory; import org.springframework.beans.BeansException; import org.springframework.beans.factory.config.BeanPostProcessor; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; import org.springframework.stereotype.Component; import java.util.Map;/** * 啟動載入-過濾異常日誌 * @author fanht * @date 2022-03-22 14:12 * @versio */ @Component public class DiscoveringPostProcessor implements BeanPostProcessor, ApplicationContextAware { private ApplicationContext applicationContext; @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {this.applicationContext = applicationContext; } @Override public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { return BeanPostProcessor.super.postProcessBeforeInitialization(bean, beanName); } @Override public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {if(bean instanceof LafengLogFilter){ Map<String, TurboFilter> filterBeans = applicationContext.getBeansOfType(TurboFilter.class); for (TurboFilter filter : filterBeans.values()) { LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory(); loggerContext.addTurboFilter(filter); } } return BeanPostProcessor.super.postProcessAfterInitialization(bean, beanName); } }
這個主要是通過TurboFilter來實現的
package com.gwm.lafeng.filter.log; import ch.qos.logback.classic.Level; import ch.qos.logback.classic.Logger; import ch.qos.logback.classic.turbo.TurboFilter; import ch.qos.logback.core.spi.FilterReply; import com.alibaba.fastjson.JSONObject; import com.gwm.lafeng.filter.DingdingAlarmUtil; import com.gwm.lafeng.filter.IPUtil; import com.gwm.lafeng.filter.VerifyConst; import org.slf4j.MDC; import org.slf4j.Marker; import org.springframework.stereotype.Component; import java.text.MessageFormat; /** * 異常日誌堆疊-用於非執行時異常的告警提示 * @author fanht * @date 2022-03-21 17:28 * @versio 1.0 */ @Component public class LafengLogFilter extends TurboFilter { @Override public FilterReply decide(Marker marker, Logger logger, Level level, String s, Object[] objects, Throwable throwable) { //todo 如果是非執行時異常 傳送釘釘告警。排除執行時異常 if(throwable != null && level.equals(Level.ERROR) && !logger.getName().equals(VerifyConst.UN_SEND_CLASS)){ String mess = MessageFormat.format("介面異常告警:專案:{0},環境:{1},IP:{2},traceId:{3},介面地址:{4},錯誤資訊:{5},異常資訊:{6}", DingdingAlarmUtil.applicationName, DingdingAlarmUtil.env, IPUtil.initIp(), MDC.get("traceId"), logger.getName(), s, JSONObject.toJSON(throwable.getMessage().length() >4000 ? throwable.getMessage().substring(0,4000):throwable.getMessage())); DingdingAlarmUtil.sendDingdingAlerm(mess, DingdingAlarmUtil.dingdingTokenUrl); } return FilterReply.ACCEPT; } }