All Products
Search
Document Center

SchedulerX:Integrasikan Simple Log Service dengan SchedulerX 2.0

Last Updated:Mar 12, 2026

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:

Catatan

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:

StrategiCakupanTrade-off
Log hanya untuk pekerjaanLog yang ditulis ke logger schedulerxMemisahkan log pekerjaan dari log aplikasi. Direkomendasikan untuk sebagian besar kasus penggunaan.
Semua log aplikasiSemua log melalui root loggerMengambil semua log, tetapi mencampur log pekerjaan dengan output aplikasi umum dan mengurangi efisiensi kueri.

Log4j2

Kumpulkan log hanya untuk pekerjaan (direkomendasikan)

  1. Tambahkan appender SchedulerX dan logger khusus schedulerx ke 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>
  2. Pada prosesor pekerjaan Anda, buat logger bernama schedulerx dan 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)

  1. Tambahkan appender dan logger khusus schedulerx ke log4j.properties:

        log4j.rootLogger = INFO,console
        log4j.logger.schedulerx=schedulerxLog
        log4j.appender.schedulerxLog=com.alibaba.schedulerx.worker.log.appender.SchedulerxLog4jAppender
  2. Pada prosesor pekerjaan Anda, buat logger bernama schedulerx dan 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.SchedulerxLog4jAppender

Logback

Catatan

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)

  1. Tambahkan appender dan logger khusus schedulerx ke 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>
  2. Pada prosesor pekerjaan Anda, buat logger bernama schedulerx dan 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

  1. Masuk ke Konsol SchedulerX.

  2. Pada panel navigasi sebelah kiri, klik Task Management.

  3. Temukan pekerjaan target dan pilih more > Historical records pada kolom Operation.

  4. Pada panel Task instance records, temukan instans pekerjaan target dan klik Log pada kolom Operation.

Bidang log

FieldDescription
ipAlamat IP worker yang menghasilkan entri log tersebut.
executionIdID eksekusi dalam format ${jobId}_${jobInstanceId}_${taskId}. Gunakan ID ini untuk mengorelasikan log di seluruh tugas terdistribusi.
levelLevel log, seperti INFO, WARN, atau ERROR.
logIsi log.
throwableJejak stack exception. Hanya muncul ketika aplikasi melemparkan error.
timeTimestamp 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.

  1. 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);
            }
        }
  2. 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;
            }
        }
  3. Konfigurasikan pekerjaan di Konsol SchedulerX. Atur parameter pekerjaan menjadi 1 0 untuk memicu error pembagian dengan nol.

    Job configuration with parameters 1 0

  4. Jalankan pekerjaan, buka panel Task instance records, dan periksa log-nya. Log tersebut menunjukkan bahwa TestServiceImpl melemparkan ArithmeticException ("/ by zero"), yang menyebabkan pekerjaan gagal.

    Log showing division by zero error

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.

  1. Buat prosesor pekerjaan map yang mendistribusikan pesan. Pada contoh ini, msg_23 sengaja 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);
            }
        }
  2. Konfigurasikan pekerjaan di Konsol SchedulerX dan jalankan.

    Distributed job configuration

  3. Buka penampil log. Untuk petunjuknya, lihat Langkah 3: Lihat log pekerjaan.

  4. Cari kata kunci seperti failed untuk menemukan subtugas yang gagal (msg_23) dan akar permasalahannya.