xxl-job异步不打印日志解决方案

xxl-job存在的问题

  • 在定时器使用异步或者使用线程池来实现异步处理(比如有时远程调用会超时,像网关会设置超时的时间等等)在代码中打印日志不输出的问题。

接下来我们看下导致的原因

源码

XxlJobLogger.log

在这里插入图片描述

在这里插入图片描述
XxlJobFileAppender.contextHolder

在这里插入图片描述

InheritableThreadLocal为何物?

我在之前的博客已经有相应的讲解

InheritableThreadLocal为父子线程传递,就是如果你在当前线程下创建新的线程,它在创建线程的过程会把当前线程的变量copy到子线程里面。这种情况是可以打印出日志的。

另一种情况是你使用了自己定义的线程池,进行异步处理事务。

解决方案

1.在创建线程的时候,XxlJobFileAppender.contextHolder.set()一下日志文件名称。

2.重写一下打印日志的代码,避免同事失误打印不出来日志,下面大概写下思路,具体还没去验证,凑合着看下,嘻嘻~

public class XxlJobLoggerChild extends XxlJobLogger {

    public static final TransmittableThreadLocal<String> contextHolder = new TransmittableThreadLocal<>();

    private static Logger logger = LoggerFactory.getLogger("xxl-job logger");

    public static void log(String appendLogPattern, Object... appendLogArguments) {
        FormattingTuple ft = MessageFormatter.arrayFormat(appendLogPattern, appendLogArguments);
        String appendLog = ft.getMessage();
        StackTraceElement callInfo = (new Throwable()).getStackTrace()[1];
        logDetail(callInfo, appendLog);
    }

    @PostConstruct
    public void someMethod() {
        contextHolder.set(XxlJobFileAppender.contextHolder.get());
    }

    private static void logDetail(StackTraceElement callInfo, String appendLog) {
        StringBuffer stringBuffer = new StringBuffer();
        stringBuffer.append(DateUtil.formatDateTime(new Date())).append(" ").append("[" + callInfo.getClassName() + "#" + callInfo.getMethodName() + "]").append("-").append("[" + callInfo.getLineNumber() + "]").append("-").append("[" + Thread.currentThread().getName() + "]").append(" ").append(appendLog != null ? appendLog : "");
        String formatAppendLog = stringBuffer.toString();
        String logFileName = contextHolder.get();
        if (logFileName != null && logFileName.trim().length() > 0) {
            XxlJobFileAppender.appendLog(logFileName, formatAppendLog);
        } else {
            logger.info(">>>>>>>>>>> {}", formatAppendLog);
        }

    }

}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值