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

简介: 阿里巴巴任务调度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日志并进行多维度分析。
目录
相关文章
|
2天前
|
分布式计算 监控 Spark
Spark 任务运行时日志分析
Spark 任务运行时日志分析
54 0
|
2天前
|
分布式计算 DataWorks 关系型数据库
DataWorks操作报错合集之在DataWorks中设置了一个任务节点的调度时间,并将其发布到生产环境,但到了指定时间(例如17:30)却没有产生运行实例和相关日志如何解决
DataWorks是阿里云提供的一站式大数据开发与治理平台,支持数据集成、数据开发、数据服务、数据质量管理、数据安全管理等全流程数据处理。在使用DataWorks过程中,可能会遇到各种操作报错。以下是一些常见的报错情况及其可能的原因和解决方法。
31 0
|
2天前
|
弹性计算 运维 Shell
自动化任务调度和日志记录
【4月更文挑战第30天】
7 0
|
2天前
|
SQL 资源调度 Oracle
Flink CDC产品常见问题之sql运行中查看日志任务失败如何解决
Flink CDC(Change Data Capture)是一个基于Apache Flink的实时数据变更捕获库,用于实现数据库的实时同步和变更流的处理;在本汇总中,我们组织了关于Flink CDC产品在实践中用户经常提出的问题及其解答,目的是辅助用户更好地理解和应用这一技术,优化实时数据处理流程。
|
2天前
|
分布式计算 DataWorks 调度
DataWorks常见问题之设置好调度时间的任务运行后查看运行日志报错如何解决
DataWorks是阿里云提供的一站式大数据开发与管理平台,支持数据集成、数据开发、数据治理等功能;在本汇总中,我们梳理了DataWorks产品在使用过程中经常遇到的问题及解答,以助用户在数据处理和分析工作中提高效率,降低难度。
43 0
|
7月前
|
消息中间件 存储 Kafka
Flink集群使用kafka_appender收集flink产生的日志,但是现在实时运行的任务超过了
Flink集群使用kafka_appender收集flink产生的日志,但是现在实时运行的任务超过了
150 1
|
2天前
|
分布式计算 监控 Hadoop
Hadoop MR 任务运行时日志分析
Hadoop MR 任务运行时日志分析
33 0
|
运维 监控 数据处理
SLS智能巡检最佳实践:创建预测任务
日志服务 SLS 智能异常分析 APP 提供自动化、智能化模型训练能力,可以根据设定的历史数据区间进行监督建模。您可以使用模型训练任务通过监督的方式加强对自身数据的异常学习,来提升未来的异常预警的准确率,模型训练任务主要有以下优势:直接使用SLS的智能巡检功能,准确率不及预期,可以选择使用SLS的模型训练任务,来提升异常检测的准确性智能巡检检测出来的异常和您所认为的异常之间可能存在gap,这种情况
215 0
|
应用服务中间件 测试技术 nginx
Python 实时获取任务请求对应的Nginx日志
Python 实时获取任务请求对应的Nginx日志
81 1
|
消息中间件 监控 NoSQL
Hyperf结合Redis异步队列任务async-queue实现后台操作日志写入
Hyperf结合Redis异步队列任务async-queue实现后台操作日志写入
391 0
Hyperf结合Redis异步队列任务async-queue实现后台操作日志写入

热门文章

最新文章