XXL-Job将log日志同步输出到XXL-JOB调度日志面板中方法

package com.ninerapoint.tms.config;

import com.xxl.job.core.context.XxlJobHelper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * xxljob 页面日志增强
 */
public class LoggerEnhancer {
 
    private static final Map<Class<?>, Logger> LOGGER_CACHE = new HashMap<>();
 
    private final static List<String> ENHANCE_METHOD_LIST = Arrays.asList("info", "debug", "error");
 
    public static Logger getLogger(Class<?> clazz) {
        if (LOGGER_CACHE.containsKey(clazz)) {
            return LOGGER_CACHE.get(clazz);
        }
        Logger logger = LoggerFactory.getLogger(clazz);
        LOGGER_CACHE.put(clazz, logger);
        return logger;
    }
 
    public static Logger createLogger(Class<?> clazz) {
        Object proxy = Enhancer.create(Logger.class, new LoggerMethodInterceptor(clazz));
        return (Logger) proxy;
    }
 
    public static class LoggerMethodInterceptor implements MethodInterceptor {
 
        private final Class<?> clazz;
 
        public LoggerMethodInterceptor(Class<?> clazz) {
            this.clazz = clazz;
        }
 
        @Override
        public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
            if (ENHANCE_METHOD_LIST.contains(method.getName()) && objects != null && objects.length  > 0) {
                Object[] args = new Object[0];
                if (objects.length > 1) {
 
                    // 超过3个参数时 logger 通过不定参数形式重载
                    if (method.getParameterCount() == 2 && method.getParameters()[1].getType().isArray()) {
                        args = (Object[]) objects[1];
                    }else {
                        args = new Object[objects.length - 1];
                        System.arraycopy(objects, 1, args, 0, args.length);
                    }
                }
                String temp = (String) objects[0];
                log(method.getName(), temp, args);
            }
            return null;
 
        }
 
        public void log(String methodName, String str, Object... args) {
            Logger logger = getLogger(clazz);
            switch (methodName) {
                case "log":
                    logger.info(str, args);
                    XxlJobHelper.log(str, args);
                    break;
                case "debug":
                    logger.debug(str, args);
                    XxlJobHelper.log(str, args);
                    break;
                case "error":
                    logger.error(str, args);
                    logError(str, args);
                    break;
                default:
                    logger.info(str, args);
                    XxlJobHelper.log(str, args);
            }
        }
 
        public static void logError(String str, Object... args) {
            for (Object arg : args) {
                if (arg instanceof Throwable) {
                    XxlJobHelper.log((Throwable)arg);
                    return;
                }
            }
            XxlJobHelper.log(str, args);
        }
    }
}

使用拦截器增强 即可将日志同步输出到xxljob dashboard 中
只需在要打印日志的类中添加一下代码即可 代替原来的@Slf4j 即可

private static final Logger log = LoggerEnhancer.createLogger(KeyExchangeJob.class);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值