XXL-JOB系列五之调度日志

2024-07-02 15:28:41 浏览数 (1)

1 日志保存

在xxl-job中每次调度都会产生一次调度记录保存到xxl_job_log表中,调度记录对应的日志保存在执行器的服务器上,每条调度记录对应一个日志文件,在JobThread的run方法中开始进行日志的记录,非核心代码省略

代码语言:javascript复制
public void run() {
    ......
    // execute
    while(!toStop){
       ......
          if (triggerParam!=null) {
             ......
             // 此处根据调度的时间和logId生成对应日志文件名称
             // 比如 "logPath/yyyy-MM-dd/logId.log"
             String logFileName = XxlJobFileAppender.makeLogFileName(new Date(triggerParam.getLogDateTime()), triggerParam.getLogId());
             XxlJobContext xxlJobContext = new XxlJobContext(
                   triggerParam.getJobId(),
                   triggerParam.getExecutorParams(),
                   logFileName,
                   triggerParam.getBroadcastIndex(),
                   triggerParam.getBroadcastTotal());

             // 设置上下文信息
             XxlJobContext.setXxlJobContext(xxlJobContext);

             // 将日志记录到日志文件中,文件名称从context中获取
             XxlJobHelper.log("<br>----------- xxl-job job execute start -----------<br>----------- Param:"   xxlJobContext.getJobParam());
             ......
      }
}

执行器在处理任务时首先根据调度时间和LogId生成文件名,调用XxlJobHelper.log方法,最终都是调用logDetail方法记录日志,主要就是获取调用方的一些信息,然后封装成固定的格式写入到文件中,这样就完成了日志文件的保存

代码语言:javascript复制
private static boolean logDetail(StackTraceElement callInfo, String appendLog) {
    XxlJobContext xxlJobContext = XxlJobContext.getXxlJobContext();
    if (xxlJobContext == null) {
        return false;
    }

    /*// "yyyy-MM-dd HH:mm:ss [ClassName]-[MethodName]-[LineNumber]-[ThreadName] log";
    StackTraceElement[] stackTraceElements = new Throwable().getStackTrace();
    StackTraceElement callInfo = stackTraceElements[1];*/

    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();

    // appendlog
    String logFileName = xxlJobContext.getJobLogFileName();

    if (logFileName!=null && logFileName.trim().length()>0) {
        XxlJobFileAppender.appendLog(logFileName, formatAppendLog);
        return true;
    } else {
        logger.info(">>>>>>>>>>> {}", formatAppendLog);
        return false;
    }
}

2 日志查看

当在调度中心需要查看某次调度记录的日志时,调度中心需要调用对应的执行器的接口将详细日志查询过来在页面上展示,如果执行器挂了,那么日志也就看不了了,执行器的ExecutorBiz提供一个log方法来读取日志文件的内容返回给调度中心

代码语言:javascript复制
public ReturnT<LogResult> log(LogParam logParam) {
    // log filename: logPath/yyyy-MM-dd/9999.log
    String logFileName = XxlJobFileAppender.makeLogFileName(new Date(logParam.getLogDateTim()), logParam.getLogId());

    LogResult logResult = XxlJobFileAppender.readLog(logFileName, logParam.getFromLineNum());
    return new ReturnT<LogResult>(logResult);
}

这样就完成了日志的记录和查看

0 人点赞