Saat pekerjaan gagal atau berperilaku tidak sesuai harapan, Anda memerlukan log eksekusi untuk mengidentifikasi akar permasalahan. Dengan mengintegrasikan Simple Log Service ke SchedulerX 2.0, Anda dapat mengumpulkan log eksekusi pekerjaan—termasuk log pekerjaan terdistribusi—dan melihatnya langsung di Konsol SchedulerX. Tambahkan appender Log4j 2, Log4j, atau Logback untuk mulai mengumpulkan log dari pekerjaan yang dipicu.
Prasyarat
Sebelum memulai, pastikan Anda telah:
Membuat namespace di SchedulerX
Sebuah kelompok aplikasi yang dibuat di SchedulerX
Mengaktifkan Edisi Profesional SchedulerX 2.0 dengan Simple Log Service

Simple Log Service menyimpan log hingga dua minggu. Log yang kedaluwarsa akan dihapus secara otomatis.
Cara kerja
Konfigurasikan appender log SchedulerX dalam framework logging Anda (Log4j 2, Log4j, atau Logback).
Dalam kode pekerjaan Anda, tulis log menggunakan logger bernama
schedulerx.Saat pekerjaan dijalankan, SchedulerX mengumpulkan log tersebut dan menampilkannya di konsol.
Pilih metode pengumpulan log
SchedulerX mendukung dua metode pengumpulan log. Pilih salah satu sebelum mengonfigurasi appender.
| Metode | Mengumpulkan | Paling cocok untuk | Kompromi |
|---|---|---|---|
| Hanya log pekerjaan | Log yang ditulis ke logger schedulerx | Troubleshooting spesifik pada pekerjaan tertentu | Memerlukan logger khusus dalam kode Anda |
| Semua log layanan | Semua log aplikasi | Visibilitas penuh terhadap aplikasi | Mencampur log pekerjaan dengan log layanan, sehingga mengurangi efisiensi kueri |
Perbarui agen SchedulerX
Perbarui agen SchedulerX ke versi terbaru. Untuk nomor versi terbaru, lihat Catatan Rilis.
Tambahkan dependensi berikut ke file pom.xml Anda (contoh Spring Boot Starter):
<dependency>
<groupId>com.aliyun.schedulerx</groupId>
<artifactId>schedulerx2-spring-boot-starter</artifactId>
<version>${Latest version of the SchedulerX client}</version>
</dependency>Konfigurasikan appender log
Pilih framework logging Anda di bawah ini. Setiap framework mendukung kedua metode pengumpulan log.
Log4j 2
Kumpulkan hanya log pekerjaan
Tambahkan appender dan logger khusus ke file konfigurasi Log4j 2 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>Dalam kelas 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 "schedulerx" sebagai nama logger 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 layanan
Tambahkan appender schedulerxLog ke root logger. Semua log aplikasi kemudian dikumpulkan oleh SchedulerX.
Pendekatan ini mencampur log layanan dengan log pekerjaan, yang dapat menyulitkan troubleshooting dan mengurangi efisiensi kueri.
<?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 hanya log pekerjaan
Tambahkan appender dan logger khusus ke file
log4j.propertiesAnda:log4j.rootLogger = INFO,console log4j.logger.schedulerx=schedulerxLog log4j.appender.schedulerxLog=com.alibaba.schedulerx.worker.log.appender.SchedulerxLog4jAppenderDalam kelas pekerjaan Anda, buat logger bernama
schedulerxdan gunakan untuk menulis log. Kode Java identik dengan contoh Log4j 2 di atas — gunakanLoggerFactory.getLogger("schedulerx").
Kumpulkan semua log layanan
Tambahkan appender schedulerxLog ke root logger dalam log4j.properties:
log4j.rootLogger = INFO,console,schedulerxLog
log4j.appender.schedulerxLog=com.alibaba.schedulerx.worker.log.appender.SchedulerxLog4jAppenderLogback
Kelas SchedulerxLogbackAppender berada dalam paket schedulerx2-worker.jar. Pastikan agen SchedulerX telah diperbarui ke versi terbaru. Untuk versi terbaru, lihat Catatan Rilis.
Kumpulkan hanya log pekerjaan
Tambahkan appender dan logger khusus ke file
logback.xmlAnda:<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>Dalam kelas pekerjaan Anda, buat logger bernama
schedulerxdan gunakan untuk menulis log. Kode Java identik dengan contoh Log4j 2 di atas — gunakanLoggerFactory.getLogger("schedulerx").
Kumpulkan semua log layanan
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>Lihat log pekerjaan
Masuk ke Konsol MSE SchedulerX.
Di panel navigasi sebelah kiri, klik Task Management.
Temukan pekerjaan target dan pilih di kolom Operation.
Di panel Task instance records, temukan instans pekerjaan target dan klik Log di kolom Operation.
Bidang log
Setiap entri log berisi bidang-bidang berikut:
| Bidang | Deskripsi |
|---|---|
ip | Alamat IP worker yang menghasilkan log |
executionId | ID eksekusi dalam format ${jobId}_${jobInstanceId}_${taskId} |
level | Level log (misalnya, INFO atau ERROR) |
log | Isi log |
throwable | Jejak stack exception (hanya muncul saat terjadi error) |
time | Timestamp saat log dihasilkan |
Kueri log historis
SchedulerX hanya menyimpan 60 catatan eksekusi terbaru per instans pekerjaan. Untuk mencari catatan yang lebih lama, klik Log Query di panel navigasi sebelah kiri Konsol SchedulerX. Di halaman Log Query, filter berdasarkan job ID, kata kunci, atau rentang waktu.
Contoh troubleshooting
Diagnosis kegagalan layanan
Setelah mengintegrasikan Simple Log Service, SchedulerX mengumpulkan log pekerjaan dan log layanan, termasuk exception. Contoh berikut menunjukkan cara mengidentifikasi error pembagian dengan nol dalam pemanggilan layanan.
Buat pekerjaan yang memanggil metode layanan dan mencatat log menggunakan 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 { // Gunakan logger schedulerx untuk mengumpulkan log 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 mengumpulkan log 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. Misalnya, atur parameter pekerjaan menjadi
1 0untuk memicu error pembagian dengan nol.
Jalankan pekerjaan sekali, lalu buka panel Task instance records dan lihat log-nya. Log tersebut menunjukkan bahwa pekerjaan gagal karena
TestServiceImplmelemparkan exception "by zero".
Diagnosis kegagalan pekerjaan terdistribusi
Pekerjaan terdistribusi di SchedulerX 2.0 mendistribusikan subtugas ke beberapa worker untuk pemrosesan batch. Jika subtugas gagal, gunakan log untuk mengidentifikasi tugas spesifik yang gagal beserta penyebabnya.
Buat pekerjaan terdistribusi yang mendistribusikan subtugas dan mencatat log menggunakan 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); } }Konfigurasikan pekerjaan di Konsol SchedulerX dan picu eksekusinya.

Buka log pekerjaan seperti dijelaskan dalam Lihat log pekerjaan.
Cari kata kunci (seperti
failedatauerror) untuk menemukan subtugas yang gagal dan akar permasalahannya.