Saat pekerjaan terjadwal gagal atau menghasilkan output yang tidak sesuai harapan, Anda memerlukan log terpusat yang dapat dicari untuk mengidentifikasi akar permasalahan—terutama untuk pekerjaan terdistribusi yang dijalankan di beberapa worker. Simple Log Service pada SchedulerX 2.0 mengumpulkan log eksekusi dari semua jenis pekerjaan, termasuk pekerjaan terdistribusi, dan menyediakannya melalui Konsol SchedulerX. Untuk menyiapkan integrasi ini, tambahkan appender SchedulerX ke konfigurasi Log4j2, Log4j, atau Logback Anda.
Sebelum memulai
Pastikan Anda telah memiliki:
SchedulerX 2.0 Edisi Profesional dengan Simple Log Service yang telah diaktifkan

Log disimpan hingga dua minggu setelah aktivasi. Log yang kedaluwarsa akan dihapus secara otomatis.
Langkah 1: Perbarui agent SchedulerX
Perbarui agent SchedulerX ke versi terbaru. Untuk detail versi, lihat Catatan rilis.
Jika aplikasi Anda menggunakan Spring Boot Starter, tambahkan dependensi berikut ke pom.xml:
<dependency>
<groupId>com.aliyun.schedulerx</groupId>
<artifactId>schedulerx2-spring-boot-starter</artifactId>
<version>${Latest version of the SchedulerX client}</version>
</dependency>Langkah 2: Konfigurasikan appender log
SchedulerX menyediakan appender untuk Log4j2, Log4j, dan Logback. Pilih bagian yang sesuai dengan framework logging Anda.
Tersedia dua strategi pengumpulan:
| Strategi | Cakupan | Trade-off |
|---|---|---|
| Log hanya untuk pekerjaan | Log yang ditulis ke logger schedulerx | Memisahkan log pekerjaan dari log aplikasi. Direkomendasikan untuk sebagian besar kasus penggunaan. |
| Semua log aplikasi | Semua log melalui root logger | Mengambil semua log, tetapi mencampur log pekerjaan dengan output aplikasi umum dan mengurangi efisiensi kueri. |
Log4j2
Kumpulkan log hanya untuk pekerjaan (direkomendasikan)
Tambahkan appender SchedulerX dan logger khusus
schedulerxke file konfigurasi Log4j2 Anda:<?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>Pada prosesor pekerjaan Anda, buat logger bernama
schedulerxdan gunakan untuk menulis log: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 { // Gunakan logger "schedulerx" untuk mengirim log ke Simple Log Service private static final Logger logger = LoggerFactory.getLogger("schedulerx"); @Override public ProcessResult process(JobContext context) throws Exception { logger.info("hello HelloWorldJob3"); return new ProcessResult(true); } }
Kumpulkan semua log aplikasi
Untuk mengumpulkan semua log, tambahkan appender schedulerxLog ke root logger, bukan ke logger khusus:
<?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
Kumpulkan log hanya untuk pekerjaan (direkomendasikan)
Tambahkan appender dan logger khusus
schedulerxkelog4j.properties:log4j.rootLogger = INFO,console log4j.logger.schedulerx=schedulerxLog log4j.appender.schedulerxLog=com.alibaba.schedulerx.worker.log.appender.SchedulerxLog4jAppenderPada prosesor pekerjaan Anda, buat logger bernama
schedulerxdan gunakan untuk menulis log: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 { // Gunakan logger "schedulerx" untuk mengirim log ke Simple Log Service private static final Logger logger = LoggerFactory.getLogger("schedulerx"); @Override public ProcessResult process(JobContext context) throws Exception { logger.info("hello HelloWorldJob3"); return new ProcessResult(true); } }
Kumpulkan semua log aplikasi
Untuk mengumpulkan semua log, tambahkan appender schedulerxLog ke root logger dalam log4j.properties:
log4j.rootLogger = INFO,console,schedulerxLog
log4j.appender.schedulerxLog=com.alibaba.schedulerx.worker.log.appender.SchedulerxLog4jAppenderLogback
SchedulerxLogbackAppender dikemas dalam schedulerx2-worker.jar. Pastikan Anda telah memperbarui agent SchedulerX ke versi terbaru sebelum mengonfigurasi appender ini. Untuk detail versi, lihat Catatan rilis.
Kumpulkan log hanya untuk pekerjaan (direkomendasikan)
Tambahkan appender dan logger khusus
schedulerxkelogback.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>Pada prosesor pekerjaan Anda, buat logger bernama
schedulerxdan gunakan untuk menulis log: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 { // Gunakan logger "schedulerx" untuk mengirim log ke Simple Log Service private static final Logger logger = LoggerFactory.getLogger("schedulerx"); @Override public ProcessResult process(JobContext context) throws Exception { logger.info("hello HelloWorldJob3"); return new ProcessResult(true); } }
Kumpulkan semua log aplikasi
Untuk mengumpulkan semua log, tambahkan appender schedulerxLog ke root logger dalam 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>Langkah 3: Lihat log pekerjaan
Masuk ke Konsol SchedulerX.
Pada panel navigasi sebelah kiri, klik Task Management.
Temukan pekerjaan target dan pilih more > Historical records pada kolom Operation.
Pada panel Task instance records, temukan instans pekerjaan target dan klik Log pada kolom Operation.
Bidang log
| Field | Description |
|---|---|
ip | Alamat IP worker yang menghasilkan entri log tersebut. |
executionId | ID eksekusi dalam format ${jobId}_${jobInstanceId}_${taskId}. Gunakan ID ini untuk mengorelasikan log di seluruh tugas terdistribusi. |
level | Level log, seperti INFO, WARN, atau ERROR. |
log | Isi log. |
throwable | Jejak stack exception. Hanya muncul ketika aplikasi melemparkan error. |
time | Timestamp entri log. |
Kueri log berdasarkan kata kunci
SchedulerX 2.0 hanya menyimpan 60 catatan eksekusi terbaru dari suatu instans pekerjaan. Untuk mencari eksekusi yang lebih lama, klik Log Query pada panel navigasi sebelah kiri. Pada halaman Log Query, filter berdasarkan job ID, kata kunci, atau rentang waktu.
Contoh pemecahan masalah
Diagnosis kegagalan pekerjaan
Dengan integrasi Simple Log Service, SchedulerX menangkap log tingkat pekerjaan maupun exception tingkat layanan. Contoh ini menunjukkan bagaimana error pembagian dengan nol muncul dalam output log.
Buat prosesor pekerjaan yang memanggil metode layanan dan mencatat hasilnya:
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 { // Gunakan logger "schedulerx" untuk mengirim log ke Simple Log Service 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); } }Buat kelas layanan:
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 { // Gunakan logger "schedulerx" untuk mengirim log ke Simple Log Service 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; } }Konfigurasikan pekerjaan di Konsol SchedulerX. Atur parameter pekerjaan menjadi
1 0untuk memicu error pembagian dengan nol.
Jalankan pekerjaan, buka panel Task instance records, dan periksa log-nya. Log tersebut menunjukkan bahwa
TestServiceImplmelemparkanArithmeticException("/ by zero"), yang menyebabkan pekerjaan gagal.
Diagnosis kegagalan pekerjaan terdistribusi
Pekerjaan terdistribusi mendistribusikan subtugas ke beberapa worker untuk pemrosesan batch. Saat subtugas gagal, cari log untuk mengidentifikasi tugas yang gagal beserta penyebabnya.
Buat prosesor pekerjaan map yang mendistribusikan pesan. Pada contoh ini,
msg_23sengaja diatur agar gagal: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); } }Konfigurasikan pekerjaan di Konsol SchedulerX dan jalankan.

Buka penampil log. Untuk petunjuknya, lihat Langkah 3: Lihat log pekerjaan.
Cari kata kunci seperti
faileduntuk menemukan subtugas yang gagal (msg_23) dan akar permasalahannya.