前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >XXL-JOB系列五之调度日志

XXL-JOB系列五之调度日志

原创
作者头像
用户9511949
发布2024-07-02 15:28:41
160
发布2024-07-02 15:28:41
举报
文章被收录于专栏:XXL-JOBXXL-JOB

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

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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
作者已关闭评论
0 条评论
热度
最新
推荐阅读
目录
  • 1 日志保存
  • 2 日志查看
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档