阿里巴巴分布式任务调度系统SchedulerX 2.0提供日志服务,您无需修改代码,只需增加一个Log4j或Logback的配置,即可在控制台看到每次任务调度(包括分布式任务)的业务日志。本文介绍如何通过SchedulerX接入并查看日志服务。
前提条件
- (可选)创建命名空间。
- 创建资源。
-
应用升级为专业版并开通日志服务。具体操作,请参见如何升级为专业版。说明 开通日志服务后,当前日志最多可保留2周,超过2周的日志会被清理。
接入配置
升级SchedulerX客户端版本
将SchedulerX客户端版本升级到1.4.0以上版本,以Spring Boot Starter为例,在应用程序的pom.xml
文件中添加SchedulerxWorker依赖。
<dependency>
<groupId>com.aliyun.schedulerx</groupId>
<artifactId>schedulerx2-spring-boot-starter</artifactId>
<version>1.3.4</version>
</dependency>
配置Log Appender采集日志服务
Log4j2 Appender
- 方法一:单独收集任务调度日志
该方法可以由业务自己控制,只将任务调度日志采集,其他业务代码不会采集,方便排查问题。
log4j2
增加一个Appender和Logger如下:<?xml version="1.0" encoding="UTF-8"?> <Configuration status="off"> <Appenders> <Console name="Console" target="SYSTEM_OUT"> <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %m%n" /> </Console> <SchedulerxLog4j2Appender name="schedulerxLog" timeFormat="yyyy-MM-dd'T'HH:mmZ" timeZone="UTC" ignoreExceptions="true"> <PatternLayout pattern="%d %-5level [%thread] %logger{0}: %msg"/> </SchedulerxLog4j2Appender> </Appenders> <Loggers> <Root level="info"> <AppenderRef ref="Console" /> </Root> <Logger name="schedulerx" level="info" additivity="false"> <AppenderRef ref="schedulerxLog" /> </Logger> </Loggers> </Configuration>
- 修改业务代码如下,使用Logger: schedulerx采集任务调度的日志。
package com.hxm.test.processor; import com.alibaba.schedulerx.worker.domain.JobContext; import com.alibaba.schedulerx.worker.processor.JavaProcessor; import com.alibaba.schedulerx.worker.processor.ProcessResult; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; @Component public class HelloWorldJob3 extends JavaProcessor { private static final Logger logger = LoggerFactory.getLogger("schedulerx"); @Override public ProcessResult process(JobContext context) throws Exception { LOGGER.info("hello HelloWorldJob3"); return new ProcessResult(true); } }
- 方法二:搜集所有业务日志
该方法只需要配置Log4j文件,不需要修改一行业务代码。如果将SchedulerxLog配置在rootLogger里,会让所有日志都通过SchedulerX采集,不仅搜索速度较慢,而且业务日志和任务调度日志会混在一起,难以排查问题。配置如下:
<?xml version="1.0" encoding="UTF-8"?> <Configuration status="off"> <Appenders> <Console name="Console" target="SYSTEM_OUT"> <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %m%n" /> </Console> <SchedulerxLog4j2Appender name="schedulerxLog" timeFormat="yyyy-MM-dd'T'HH:mmZ" timeZone="UTC" ignoreExceptions="true"> <PatternLayout pattern="%d %-5level [%thread] %logger{0}: %msg"/> </SchedulerxLog4j2Appender> </Appenders> <Loggers> <Root level="info"> <AppenderRef ref="Console" /> <AppenderRef ref="schedulerxLog" /> </Root> </Loggers> </Configuration>
Log4j Appender
- 方法一:单独收集任务调度日志
log4j.properties
增加一个Appender和Logger。log4j.rootLogger = INFO,console log4j.logger.schedulerx=schedulerxLog log4j.appender.schedulerxLog=com.alibaba.schedulerx.worker.log.appender.SchedulerxLog4jAppender
- 修改业务代码如下,使用Logger: schedulerx采集任务调度的日志。
package com.hxm.test.processor; import com.alibaba.schedulerx.worker.domain.JobContext; import com.alibaba.schedulerx.worker.processor.JavaProcessor; import com.alibaba.schedulerx.worker.processor.ProcessResult; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; @Component public class HelloWorldJob3 extends JavaProcessor { private static final Logger logger = LoggerFactory.getLogger("schedulerx"); @Override public ProcessResult process(JobContext context) throws Exception { logger.info("hello HelloWorldJob3"); return new ProcessResult(true); } }
- 方法二:收集所有日志
log4j.properties
增加一个Appender,将这个Appender配置在rootLogger里:log4j.rootLogger = INFO,console,schedulerxLog log4j.appender.schedulerxLog=com.alibaba.schedulerx.worker.log.appender.SchedulerxLog4jAppender
Logback Appender
说明 SchedulerxLogbackAppender这个类在依赖的sdk schedulerx2-worker jar包里面,需要升级到指定版本以上(建议采用最新版本:1.6.1)。
- 方法一:单独收集任务调度日志
logback.xml
增加一个Appender和Logger。<appender name="schedulerxLog" class="com.alibaba.schedulerx.worker.log.appender.SchedulerxLogbackAppender"> <timeFormat>yyyy-MM-dd'T'HH:mmZ</timeFormat> <timeZone>UTC</timeZone> </appender> <root level="INFO"> <appender-ref ref="CONSOLE" /> </root> <logger name="schedulerx" level="INFO"> <appender-ref ref="schedulerxLog"/> </logger>
- 修改业务代码如下,使用Logger: schedulerx采集任务调度的日志。
package com.hxm.test.processor; import com.alibaba.schedulerx.worker.domain.JobContext; import com.alibaba.schedulerx.worker.processor.JavaProcessor; import com.alibaba.schedulerx.worker.processor.ProcessResult; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; @Component public class HelloWorldJob3 extends JavaProcessor { private static final Logger logger = LoggerFactory.getLogger("schedulerx"); @Override public ProcessResult process(JobContext context) throws Exception { LOGGER.info("hello HelloWorldJob3"); return new ProcessResult(true); } }
- 方法二:收集所有日志
logback.xml
增加一个Appender,将其配置在rootLogger里:<appender name="schedulerxLog" class="com.alibaba.schedulerx.worker.log.appender.SchedulerxLogbackAppender"> <timeFormat>yyyy-MM-dd'T'HH:mmZ</timeFormat> <timeZone>UTC</timeZone> </appender> <root level="INFO"> <appender-ref ref="CONSOLE" /> <appender-ref ref="schedulerxLog"/> </root>
查看输出的日志
日志中关键词的定义如下:
ip
: 打印该日志的执行机器。executionId
: 本次任务实例的执行ID,格式为${jobId}_${jobInstanceId}_${taskId}
。level
: 日志的级别。log
:日志的信息。throwable
: 应用抛出异常时,会打印该字段。time
:打印日志的时间。
应用场景及演示
查询业务失败的原因
SchedulerX 2.0的日志服务,可以收集任务的执行日志和异常,包括Service的日志都可以收集。
查询分布式任务失败原因
SchedulerX 2.0的分布式任务用来执行批量任务,例如某个任务批次执行失败了,您想查询具体是哪个子任务失败时,可执行如下操作:
根据关键字查询历史日志
任务实例的历史记录只保留最近60条。如果想排查历史上任务失败的原因,可以通过控制台左侧导航栏的日志查询来检索。日志查询支持根据任务ID、关键字和时间区间搜索。