All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.github.dadiyang.autologging.aop.handler.CommonLogJoinPointHandler Maven / Gradle / Ivy

package com.github.dadiyang.autologging.aop.handler;

import com.github.dadiyang.autologging.aop.aspect.JoinPointInfo;
import com.github.dadiyang.autologging.aop.serializer.SerializerWrapper;
import com.github.dadiyang.autologging.core.configuration.AutoLogConfig;
import com.github.dadiyang.autologging.core.listener.LocalLogTraceListener;
import com.github.dadiyang.autologging.core.listener.LogTraceListener;
import com.github.dadiyang.autologging.core.logtrace.LogTrace;
import com.github.dadiyang.autologging.core.serializer.FastJsonSerializer;
import lombok.Setter;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.NoSuchBeanDefinitionException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Import;
import org.springframework.stereotype.Component;

import java.util.LinkedList;
import java.util.List;
import java.util.Map;


/**
 * 负责处理普通的切点(非Controller)
 *
 * @author dadiyang
 * @since 2019/3/1
 */
@Slf4j
@Setter
@Import(SerializerWrapper.class)
@Component("CommonLogJoinPointHandler")
public class CommonLogJoinPointHandler implements JoinPointHandler {
    private ExceptionHandler exceptionHandler;
    protected List logTraceListeners;
    protected SerializerWrapper serializerWrapper;
    protected AutoLogConfig autoLogConfig;

    public CommonLogJoinPointHandler(AutoLogConfig autoLogConfig) {
        this.autoLogConfig = autoLogConfig;
        // 如果上下文中没有提供日志对象处理器,则添加默认的
        logTraceListeners = new LinkedList<>();
        logTraceListeners.add(new LocalLogTraceListener(autoLogConfig));
        serializerWrapper = new SerializerWrapper(new FastJsonSerializer(), autoLogConfig.getSerialize());
    }

    @Autowired
    public CommonLogJoinPointHandler(ApplicationContext applicationContext) {
        serializerWrapper = applicationContext.getBean(SerializerWrapper.class);
        autoLogConfig = applicationContext.getBean(AutoLogConfig.class);
        Map listenerMap = applicationContext.getBeansOfType(LogTraceListener.class);
        if (listenerMap != null && !listenerMap.isEmpty()) {
            logTraceListeners = new LinkedList<>(listenerMap.values());
        } else {
            // 如果上下文中没有提供日志对象处理器,则添加默认的
            logTraceListeners = new LinkedList<>();
            logTraceListeners.add(new LocalLogTraceListener(autoLogConfig));
        }
        try {
            // 异常处理器是可选的
            exceptionHandler = applicationContext.getBean(ExceptionHandler.class);
        } catch (NoSuchBeanDefinitionException e) {
            log.debug("no exceptioin handler provided");
        }
    }

    @Override
    public Object handle(JoinPointInfo joinPointInfo) throws Throwable {
        Object result = joinPointInfo.getResult();
        // 只在有注册监听器时才生成 logTrace 对象
        if (logTraceListeners != null && !logTraceListeners.isEmpty()) {
            LogTrace logTrace = getLogTrace(joinPointInfo);
            postMsg(logTrace);
        }
        Throwable throwable = joinPointInfo.getThrowable();
        if (throwable != null) {
            return handleException(joinPointInfo);
        } else {
            return result;
        }
    }

    protected LogTrace getLogTrace(JoinPointInfo joinPointInfo) {
        LogTrace logTrace = joinPointInfo.toLogTrace(autoLogConfig.getAppName());
        // 如果开启全参数或者抛出异常,则获取参数全文
        AutoLogConfig.SerializeConfig serializeConfig = autoLogConfig.getSerialize();
        // 如果配置使用全参数或者抛出了异常则使用全参数
        boolean af = serializeConfig == null || serializeConfig.getArgsFull() || joinPointInfo.getThrowable() != null;
        logTrace.setArgs(serializerWrapper.argsToString(joinPointInfo.getArgs(), af));
        // 配置明确指定为 true,才使用全返回值
        boolean rf = serializeConfig != null && serializeConfig.getResultFull();
        logTrace.setResult(serializerWrapper.resultToString(joinPointInfo.getResult(), rf));
        return logTrace;
    }

    /**
     * 处理异常,默认不处理,子类可以覆盖此方法进行统一异常处理
     * 

* 此方法的执行结果将会成为目标方法的结果,无论抛出异常还是正常返回 * * @param joinPointInfo 切点信息 * @return 期望目标方法返回的值 * @throws Throwable 目标方法抛出的异常 */ protected Object handleException(JoinPointInfo joinPointInfo) throws Throwable { if (exceptionHandler != null) { return exceptionHandler.handleException(joinPointInfo); } else { // 没注册异常处理器则不处理异常 throw joinPointInfo.getThrowable(); } } /** * 通知监听器上报消息 * @param logTrace 日志实体信息 */ protected void postMsg(LogTrace logTrace) { try { // 有监听器,则回调 for (LogTraceListener listener : logTraceListeners) { listener.update(logTrace); } } catch (Throwable e) { // 捕获所有异常,以免影响正常业务代码 log.warn("上报日志发生异常: {}", e.getMessage()); } } }





© 2015 - 2025 Weber Informatics LLC | Privacy Policy