1. 程式人生 > 其它 >Java非執行時異常提示

Java非執行時異常提示

                  有時候專案裡面寫的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;
    }
}