阿里巴巴任务调度SchedulerX支持日志服务

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 阿里巴巴任务调度SchedulerX2.0的日志服务,可以让业务方不需要修改一行代码,只需要增加一个log4j2/logback的配置,即可将每次任务调度的框架日志和业务日志进行收集,同时提供白屏日志检索功能,可以通过任务调度平台快速定位任务失败的原因。

功能简介

在当前微服务和容器化越来越流行的情况下,机器数量太多、没有权限登录容器,成为了业务同学无法快速定位业务失败的痛点。可视化白屏日志工具,越来越成为了企业的刚需。


阿里巴巴分布式任务调度系统SchedulerX2.0的日志服务,可以让业务方不需要修改一行代码,只需要增加一个log4j/logback的配置,即可在控制台看到每次任务调度(包括分布式任务)的业务日志,方便排查问题。


使用限制

开通专业版

需要开通专业版,在应用管理里,高级配置下,改成专业版,开启日志服务,如下图


日志保存时间

当前日志最多保留2周,超过2周的日志会被清理


接入配置

升级schedulerx客户端版本

将schedulerx客户端版本升级到1.4.1.1以上版本,以springboot starter为例

<dependency><groupId>com.aliyun.schedulerx</groupId><artifactId>schedulerx2-spring-boot-starter</artifactId><version>1.4.1.1</version></dependency>

配置Log Appender采集日志服务

Log4j2 Appender

方法一:单独收集任务调度日志(推荐)

该方法可以由业务自己控制,只将任务调度日志采集,其他业务代码不会采集,方便排查问题:

  1. log4j2增加一个Appender和Logger如下
<?xmlversion="1.0" encoding="UTF-8"?><Configurationstatus="off"><Appenders><Consolename="Console"target="SYSTEM_OUT"><PatternLayoutpattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %m%n"/></Console><SchedulerxLog4j2Appendername="schedulerxLog"timeFormat="yyyy-MM-dd'T'HH:mmZ"timeZone="UTC"ignoreExceptions="true"><PatternLayoutpattern="%d %-5level [%thread] %logger{0}: %msg"/></SchedulerxLog4j2Appender></Appenders><Loggers><Rootlevel="info"><AppenderRefref="Console"/></Root><Loggername="schedulerx"level="info"additivity="false"><AppenderRefref="schedulerxLog"/></Logger></Loggers></Configuration>
  1. 业务代码略微修改,使用"schedulerx"这个logger采集任务调度的日志:
packagecom.hxm.test.processor;
importcom.alibaba.schedulerx.worker.domain.JobContext;
importcom.alibaba.schedulerx.worker.processor.JavaProcessor;
importcom.alibaba.schedulerx.worker.processor.ProcessResult;
importorg.slf4j.Logger;
importorg.slf4j.LoggerFactory;
importorg.springframework.stereotype.Component;
@ComponentpublicclassHelloWorldJob3extendsJavaProcessor {
privatestaticfinalLoggerlogger=LoggerFactory.getLogger("schedulerx");
@OverridepublicProcessResultprocess(JobContextcontext) throwsException {
LOGGER.info("hello HelloWorldJob3");
returnnewProcessResult(true);
    }
}

方法二:搜集所有业务日志

该方法只需要配置log4j文件,不需要修改一行业务代码。将schedulerxLog配置在rootLogger里,会把所有日志都通过schedulerx采集,性能不好,而且其他业务日志和任务调度日志在一起,比较难排查问题,配置如下:

<?xmlversion="1.0" encoding="UTF-8"?><Configurationstatus="off"><Appenders><Consolename="Console"target="SYSTEM_OUT"><PatternLayoutpattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %m%n"/></Console><SchedulerxLog4j2Appendername="schedulerxLog"timeFormat="yyyy-MM-dd'T'HH:mmZ"timeZone="UTC"ignoreExceptions="true"><PatternLayoutpattern="%d %-5level [%thread] %logger{0}: %msg"/></SchedulerxLog4j2Appender></Appenders><Loggers><Rootlevel="info"><AppenderRefref="Console"/><AppenderRefref="schedulerxLog"/></Root></Loggers></Configuration>


Log4j Appender

方法一:单独收集任务调度日志(推荐)

  1. log4j.properties增加一个appender和logger
log4j.rootLogger = INFO,console
log4j.logger.schedulerx=schedulerxLog
log4j.appender.schedulerxLog=com.alibaba.schedulerx.worker.log.appender.SchedulerxLog4jAppender
  1. 业务代码略微修改,使用"schedulerx"这个logger采集任务调度的日志:
packagecom.hxm.test.processor;
importcom.alibaba.schedulerx.worker.domain.JobContext;
importcom.alibaba.schedulerx.worker.processor.JavaProcessor;
importcom.alibaba.schedulerx.worker.processor.ProcessResult;
importorg.slf4j.Logger;
importorg.slf4j.LoggerFactory;
importorg.springframework.stereotype.Component;
@ComponentpublicclassHelloWorldJob3extendsJavaProcessor {
privatestaticfinalLoggerlogger=LoggerFactory.getLogger("schedulerx");
@OverridepublicProcessResultprocess(JobContextcontext) throwsException {
LOGGER.info("hello HelloWorldJob3");
returnnewProcessResult(true);
    }
}

方法二:收集所有日志

log4j.properties增加一个appender,将这个appender配置在rootLogger里:

log4j.rootLogger = INFO,console,schedulerxLog
log4j.appender.schedulerxLog=com.alibaba.schedulerx.worker.log.appender.SchedulerxLog4jAppender

Logback Appender

方法一:单独收集任务调度日志(推荐)

  1. logback.xml增加一个appender和logger
<appendername="schedulerxLog"class="com.alibaba.schedulerx.worker.log.appender.SchedulerxLogbackAppender"><timeFormat>yyyy-MM-dd'T'HH:mmZ</timeFormat><timeZone>UTC</timeZone></appender><rootlevel="INFO"><appender-refref="CONSOLE"/></root><loggername="schedulerx"level="INFO"><appender-refref="schedulerxLog"/></logger>
  1. 业务代码略微修改,使用"schedulerx"这个logger采集任务调度的日志:
packagecom.hxm.test.processor;
importcom.alibaba.schedulerx.worker.domain.JobContext;
importcom.alibaba.schedulerx.worker.processor.JavaProcessor;
importcom.alibaba.schedulerx.worker.processor.ProcessResult;
importorg.slf4j.Logger;
importorg.slf4j.LoggerFactory;
importorg.springframework.stereotype.Component;
@ComponentpublicclassHelloWorldJob3extendsJavaProcessor {
privatestaticfinalLoggerlogger=LoggerFactory.getLogger("schedulerx");
@OverridepublicProcessResultprocess(JobContextcontext) throwsException {
LOGGER.info("hello HelloWorldJob3");
returnnewProcessResult(true);
    }
}

方法二:收集所有日志

logback.xml增加一个appender,将这个appender配置在rootLogger里:

<appendername="schedulerxLog"class="com.alibaba.schedulerx.worker.log.appender.SchedulerxLogbackAppender"><timeFormat>yyyy-MM-dd'T'HH:mmZ</timeFormat><timeZone>UTC</timeZone></appender><rootlevel="INFO"><appender-refref="CONSOLE"/><appender-refref="schedulerxLog"/></root>


日志输出

日志输出样例如下:

  • ip: 打印该日志的执行机器
  • executionId: 本次任务实例的执行id,格式为${jobId}_${jobInstanceId}_${taskId}
  • level: 日志级别
  • log:日志的信息
  • throwable: 如果抛异常,会打印该字段


应用场景及演示

查询业务失败的原因

SchedulerX2.0的日志服务,可以搜集任务的执行日志和异常,包括service的日志都可以收集,demo如下

  1. 新建任务代码和service业务代码,配置使用schedulerx打印日志
packagecom.hxm.test.processor;
importcom.alibaba.schedulerx.test.service.TestService;
importcom.alibaba.schedulerx.worker.domain.JobContext;
importcom.alibaba.schedulerx.worker.processor.JavaProcessor;
importcom.alibaba.schedulerx.worker.processor.ProcessResult;
importorg.apache.logging.log4j.LogManager;
importorg.apache.logging.log4j.Logger;
importorg.springframework.beans.factory.annotation.Autowired;
importorg.springframework.stereotype.Component;
@ComponentpublicclassHelloWorldJobextendsJavaProcessor {
//使用schedulerx收集日志privatestaticfinalLoggerLOGGER=LogManager.getLogger("schedulerx");
@AutowiredprivateTestServicetestService;
@OverridepublicProcessResultprocess(JobContextcontext) throwsException {
Stringparameters=context.getJobParameters();
Stringtokens[] =parameters.split(" ");
inta=Integer.valueOf(tokens[0]);
intb=Integer.valueOf(tokens[1]);
intc=testService.doDivision(a, b);
LOGGER.info("testService.doDivision finished, a={}, b={}, c={}", a, b, c);
if (c<0) {
returnnewProcessResult(false, "result="+c);
        }
returnnewProcessResult(true);
    }
}
packagecom.hxm.test.service;
importorg.apache.logging.log4j.LogManager;
importorg.apache.logging.log4j.Logger;
importorg.springframework.stereotype.Service;
@Service("testService")
publicclassTestServiceImplimplementsTestService {
//使用schedulerx收集日志privatestaticfinalLoggerLOGGER=LogManager.getLogger("schedulerx");
@OverridepublicintdoDivision(inta, intb) {
try {
LOGGER.info("start to do division c = "+a+"/"+b);
intc=a/b;
LOGGER.info("c="+c);
returnc;
        } catch (Exceptione) {
LOGGER.error("", e);
        }
return-1;
    }
}


  1. 控制台配置任务如下,根据代码来看,1除以0肯定会抛异常

  1. 运行一次后,通过任务实例列表,查看日志

如上图所以,我们可以看到失败的原因是在TestServiceImpl抛出了除0的异常

查询分布式任务失败原因

SchedulerX2.0的分布式任务用来跑批,某个批次跑批失败了,想查询具体是哪个子任务失败了,demo如下

  1. 新建任务代码如下
packagecom.hxm.test.processor;
importjava.util.ArrayList;
importjava.util.List;
importcom.alibaba.schedulerx.worker.domain.JobContext;
importcom.alibaba.schedulerx.worker.processor.MapJobProcessor;
importcom.alibaba.schedulerx.worker.processor.ProcessResult;
importorg.apache.logging.log4j.LogManager;
importorg.apache.logging.log4j.Logger;
publicclassTestMapJobProcessorextendsMapJobProcessor {
privatestaticfinalLoggerLOGGER=LogManager.getLogger("schedulerx");
@OverridepublicProcessResultprocess(JobContextcontext) throwsException {
StringtaskName=context.getTaskName();
Stringparameter=context.getJobParameters();
intdispatchNum=Integer.valueOf(parameter);
if (isRootTask(context)) {
LOGGER.info("start root task");
List<String>msgList=newArrayList<>();
for (inti=0; i<=dispatchNum; i++) {
msgList.add("msg_"+i);
            }
returnmap(msgList, "Level1Dispatch");
        } elseif (taskName.equals("Level1Dispatch")) {
Stringtask= (String)context.getTask();
if (task.equals("msg_23")) {
LOGGER.error("msg={}, failed", task);
returnnewProcessResult(false);
            } else {
LOGGER.info("msg={}, success", task);
            }
returnnewProcessResult(true);
        }
returnnewProcessResult(false);
    }
}


  1. 配置任务如下

  1. 运行一次后,查看日志

  1. 搜索关键字,快速定位失败的机器和原因

根据关键字查询历史日志

任务实例历史记录,只保留最近60条,如果想排查历史上任务失败的原因,可以通过左边栏日志查询。支持根据任务id和关键字搜索,支持查询时间区间搜索


相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
6月前
|
分布式计算 监控 Spark
Spark 任务运行时日志分析
Spark 任务运行时日志分析
99 0
|
3月前
|
运维 DataWorks 安全
DataWorks产品使用合集之任务日志中显示等待gateway调度资源,该如何解决
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
|
1月前
|
分布式计算 资源调度 数据可视化
Hadoop-06-Hadoop集群 历史服务器配置 超详细 执行任务记录 JobHistoryServer MapReduce执行记录 日志聚合结果可视化查看
Hadoop-06-Hadoop集群 历史服务器配置 超详细 执行任务记录 JobHistoryServer MapReduce执行记录 日志聚合结果可视化查看
37 1
|
6月前
|
分布式计算 DataWorks 关系型数据库
DataWorks操作报错合集之在DataWorks中设置了一个任务节点的调度时间,并将其发布到生产环境,但到了指定时间(例如17:30)却没有产生运行实例和相关日志如何解决
DataWorks是阿里云提供的一站式大数据开发与治理平台,支持数据集成、数据开发、数据服务、数据质量管理、数据安全管理等全流程数据处理。在使用DataWorks过程中,可能会遇到各种操作报错。以下是一些常见的报错情况及其可能的原因和解决方法。
|
3月前
|
数据挖掘 语音技术
3D-Speaker说话人任务的开源项目问题之语义说话人信息模块在说话人日志系统中的问题如何解决
3D-Speaker说话人任务的开源项目问题之语义说话人信息模块在说话人日志系统中的问题如何解决
|
3月前
|
数据采集 DataWorks 监控
DataWorks产品使用合集之数据集成任务日志中显示wait,是什么原因
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
|
3月前
|
数据挖掘 语音技术
3D-Speaker说话人任务的开源项目问题之视觉信息在说话人日志技术中的问题如何解决
3D-Speaker说话人任务的开源项目问题之视觉信息在说话人日志技术中的问题如何解决
|
4月前
|
数据采集 分布式计算 DataWorks
DataWorks产品使用合集之任务工作流中遇到了日志信息显示参数值没有正确解析的问题,该如何处理
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
|
6月前
|
SQL Oracle 关系型数据库
实时计算 Flink版产品使用合集之从Oracle数据库同步数据时,checkpoint恢复后无法捕获到任务暂停期间的变更日志,如何处理
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStreamAPI、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
3月前
|
消息中间件 Java 调度
"解锁RabbitMQ云版:揭秘电商巨头、日志大师、任务狂人的秘密武器,你的系统升级就差这一步!"
【8月更文挑战第14天】在分布式与微服务架构中,RabbitMQ云版本作为消息队列服务,助力系统间解耦与异步通信。通过三个场景展示其实用性:1) 订单处理系统中,利用RabbitMQ实现跨服务流程的解耦;2) 日志收集与分析,异步发送日志至中央系统,保障业务流畅;3) 任务调度,处理耗时任务避免阻塞主线程。这些应用充分展现了RabbitMQ云版本的强大功能和灵活性。
34 0