Quando jobs falham ou apresentam comportamento inesperado, os logs de execução são essenciais para identificar a causa raiz. Ao integrar o Simple Log Service ao SchedulerX 2.0, você coleta logs de execução de jobs — incluindo logs de jobs distribuídos — e os visualiza diretamente no console do SchedulerX. Adicione um appender Log4j 2, Log4j ou Logback para começar a coletar logs dos jobs acionados.
Pré-requisitos
Antes de começar, verifique se você possui:
Um namespace criado no SchedulerX
Um grupo de aplicações criado no SchedulerX
SchedulerX 2.0 Professional Edition com o Simple Log Service ativado

O Simple Log Service retém logs por até duas semanas. O sistema exclui automaticamente os logs expirados.
Como funciona
Configure um appender de log do SchedulerX no seu framework de logging (Log4j 2, Log4j ou Logback).
No código do job, grave logs usando um logger chamado
schedulerx.Durante a execução do job, o SchedulerX coleta os logs e os exibe no console.
Escolha um método de coleta de logs
O SchedulerX oferece dois métodos de coleta de logs. Escolha um antes de configurar o appender.
|
Método |
Coleta |
Mais indicado para |
Compromisso |
|
Apenas logs de jobs |
Logs gravados no logger |
Solução de problemas direcionada para jobs específicos |
Exige um logger dedicado no código |
|
Todos os logs de serviço |
Todos os logs da aplicação |
Visibilidade completa da aplicação |
Mistura logs de jobs com logs de serviço e reduz a eficiência das consultas |
Atualize o agente do SchedulerX
Atualize o agente do SchedulerX para a versão mais recente. Para obter o número da versão mais recente, consulte as Notas de versão.
Adicione a seguinte dependência ao arquivo pom.xml (exemplo com Spring Boot Starter):
<dependency>
<groupId>com.aliyun.schedulerx</groupId>
<artifactId>schedulerx2-spring-boot-starter</artifactId>
<version>${Latest version of the SchedulerX client}</version>
</dependency>
Configure um appender de log
Selecione o framework de logging abaixo. Cada framework suporta ambos os métodos de coleta de logs.
Log4j 2
Coletar apenas logs de jobs
-
Adicione um appender e um logger dedicado ao arquivo de configuração do Log4j 2:
<?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> -
Na classe do job, crie um logger chamado
schedulerxe use-o para gravar logs: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 { // Use "schedulerx" as the logger name private static final Logger logger = LoggerFactory.getLogger("schedulerx"); @Override public ProcessResult process(JobContext context) throws Exception { logger.info("hello HelloWorldJob3"); return new ProcessResult(true); } }
Coletar todos os logs de serviço
Adicione o appender schedulerxLog ao logger raiz. Assim, o SchedulerX coletará todos os logs da aplicação.
Essa abordagem mistura logs de serviço com logs de jobs, o que pode dificultar a solução de problemas e reduzir a eficiência das consultas.
<?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
Coletar apenas logs de jobs
-
Adicione um appender e um logger dedicado ao arquivo
log4j.properties:log4j.rootLogger = INFO,console log4j.logger.schedulerx=schedulerxLog log4j.appender.schedulerxLog=com.alibaba.schedulerx.worker.log.appender.SchedulerxLog4jAppender Na classe do job, crie um logger chamado
schedulerxe use-o para gravar logs. O código Java é idêntico ao exemplo do Log4j 2 acima — utilizeLoggerFactory.getLogger("schedulerx").
Coletar todos os logs de serviço
Adicione o appender schedulerxLog ao logger raiz no arquivo log4j.properties:
log4j.rootLogger = INFO,console,schedulerxLog
log4j.appender.schedulerxLog=com.alibaba.schedulerx.worker.log.appender.SchedulerxLog4jAppender
Logback
A classe SchedulerxLogbackAppender está no pacote schedulerx2-worker.jar. Certifique-se de que o agente do SchedulerX esteja atualizado para a versão mais recente. Para obter a versão mais recente, consulte as Notas de versão.
Coletar apenas logs de jobs
-
Adicione um appender e um logger dedicado ao arquivo
logback.xml:<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> Na classe do job, crie um logger chamado
schedulerxe use-o para gravar logs. O código Java é idêntico ao exemplo do Log4j 2 acima — utilizeLoggerFactory.getLogger("schedulerx").
Coletar todos os logs de serviço
Adicione o appender schedulerxLog ao logger raiz no arquivo logback.xml:
<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>
Visualizar logs de jobs
Faça login no console do MSE SchedulerX.
No painel de navegação à esquerda, clique em Task Management.
Localize o job desejado e selecione na coluna Operation.
-
No painel Task instance records, localize a instância do job desejada e clique em Log na coluna Operation.
Campos de log
Cada entrada de log contém os seguintes campos:
|
Campo |
Descrição |
|
|
Endereço IP do worker que gerou o log |
|
|
ID de execução no formato |
|
|
Nível do log (por exemplo, INFO ou ERROR) |
|
|
Conteúdo do log |
|
|
Rastreamento de pilha da exceção (presente apenas quando ocorre um erro) |
|
|
Timestamp de geração do log |
Consultar logs históricos
O SchedulerX retém apenas os 60 registros de execução mais recentes por instância de job. Para pesquisar registros mais antigos, clique em Log Query no painel de navegação à esquerda do console do SchedulerX. Na página Log Query, filtre por ID do job, palavra-chave ou intervalo de tempo.
Exemplos de solução de problemas
Diagnosticar uma falha de serviço
Após integrar o Simple Log Service, o SchedulerX coleta tanto logs de jobs quanto logs de serviço, incluindo exceções. O exemplo a seguir demonstra como identificar um erro de divisão por zero em uma chamada de serviço.
-
Crie um job que chame um método de serviço e grave logs com o logger
schedulerx:package com.hxm.test.processor; import com.alibaba.schedulerx.test.service.TestService; import com.alibaba.schedulerx.worker.domain.JobContext; import com.alibaba.schedulerx.worker.processor.JavaProcessor; import com.alibaba.schedulerx.worker.processor.ProcessResult; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @Component public class HelloWorldJob extends JavaProcessor { // Use the schedulerx logger to collect logs private static final Logger LOGGER = LogManager.getLogger("schedulerx"); @Autowired private TestService testService; @Override public ProcessResult process(JobContext context) throws Exception { String parameters = context.getJobParameters(); String tokens[] = parameters.split(" "); int a = Integer.valueOf(tokens[0]); int b = Integer.valueOf(tokens[1]); int c = testService.doDivision(a, b); LOGGER.info("testService.doDivision finished, a={}, b={}, c={}", a, b, c); if (c < 0) { return new ProcessResult(false, "result=" + c); } return new ProcessResult(true); } } -
Crie a classe de serviço:
package com.hxm.test.service; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.springframework.stereotype.Service; @Service("testService") public class TestServiceImpl implements TestService { // Use the schedulerx logger to collect logs private static final Logger LOGGER = LogManager.getLogger("schedulerx"); @Override public int doDivision(int a, int b) { try { LOGGER.info("start to do division c = " + a + "/" + b); int c = a/b; LOGGER.info("c=" + c); return c; } catch (Exception e) { LOGGER.error("", e); } return -1; } } -
Configure o job no console do SchedulerX. Por exemplo, defina os parâmetros do job como
1 0para acionar um erro de divisão por zero.
-
Execute o job uma vez e abra o painel Task instance records para visualizar os logs. O log mostra que o job falhou porque
TestServiceImpllançou uma exceção "by zero".
Diagnosticar uma falha de job distribuído
Jobs distribuídos no SchedulerX 2.0 despacham subtarefas para vários workers visando o processamento em lote. Se uma subtarefa falhar, use os logs para identificar qual tarefa específica falhou e o motivo.
-
Crie um job distribuído que despache subtarefas e grave logs com o logger
schedulerx:package com.hxm.test.processor; import java.util.ArrayList; import java.util.List; import com.alibaba.schedulerx.worker.domain.JobContext; import com.alibaba.schedulerx.worker.processor.MapJobProcessor; import com.alibaba.schedulerx.worker.processor.ProcessResult; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; public class TestMapJobProcessor extends MapJobProcessor { private static final Logger LOGGER = LogManager.getLogger("schedulerx"); @Override public ProcessResult process(JobContext context) throws Exception { String taskName = context.getTaskName(); String parameter = context.getJobParameters(); int dispatchNum = Integer.valueOf(parameter); if (isRootTask(context)) { LOGGER.info("start root task"); List<String> msgList = new ArrayList<>(); for (int i = 0; i <= dispatchNum; i++) { msgList.add("msg_" + i); } return map(msgList, "Level1Dispatch"); } else if (taskName.equals("Level1Dispatch")) { String task = (String)context.getTask(); if (task.equals("msg_23")) { LOGGER.error("msg={}, failed", task); return new ProcessResult(false); } else { LOGGER.info("msg={}, success", task); } return new ProcessResult(true); } return new ProcessResult(false); } } -
Configure o job no console do SchedulerX e acione-o.

Abra os logs do job conforme descrito em Visualizar logs de jobs.
-
Pesquise palavras-chave (como
failedouerror) para localizar a subtarefa com falha e sua causa raiz.