全部产品
Search
文档中心

Data Management:Ekspor log operasi DMS ke Alibaba Cloud Simple Log Service

更新时间:Dec 18, 2025

Data Management (DMS) mendukung ekspor log operasi ke Alibaba Cloud Simple Log Service (SLS) untuk transformasi dan analisis data.

Prasyarat

  • Anda telah mengaktifkan Simple Log Service. Untuk informasi selengkapnya, lihat Aktifkan Simple Log Service.

  • Anda telah membuat proyek Simple Log Service dan Logstore. Untuk informasi selengkapnya, lihat Kelola proyek dan Buat Logstore dasar.

  • Anda telah menambahkan proyek ke DMS pada halaman Instance Management. Untuk informasi selengkapnya tentang cara menambahkan instans, lihat Tambahkan instans ApsaraDB.

  • Logstore tujuan harus kosong. Anda harus mengaktifkan indeks teks penuh atau indeks bidang. Untuk informasi selengkapnya tentang indeks teks penuh dan indeks bidang, lihat Buat indeks.

Informasi latar belakang

Log operasi mencatat semua operasi yang dilakukan pengguna di DMS. Untuk informasi selengkapnya, lihat Fitur.

Penagihan

  • Fitur ekspor log operasi DMS ke SLS tidak dikenai biaya.

  • Jika Logstore menggunakan metode penagihan pay-by-feature, Anda akan dikenai biaya untuk item seperti storage space, read traffic, requests, data transformation, dan data shipping setelah log dikumpulkan oleh Simple Log Service. Untuk informasi selengkapnya, lihat dokumentasi penagihan.

  • Jika Logstore menggunakan metode penagihan pay-by-ingested-data, Anda akan dikenai biaya berdasarkan jumlah data mentah yang diingest setelah log dikumpulkan oleh Simple Log Service. Untuk informasi selengkapnya, lihat dokumentasi penagihan.

Prosedur

  1. Masuk ke DMS console V5.0.
  2. Arahkan pointer ke ikon 2023-01-28_15-57-17.png di pojok kiri atas, lalu pilih All Features > Security and Disaster Recovery (former DBS) > Operation Audit.

    Catatan

    Jika Anda menggunakan DMS console dalam mode normal, pilih Security and Disaster Recovery (former DBS) > Operation Audit di bilah navigasi atas.

  3. Klik tab Export Logs. Di pojok kanan atas, klik Create Task.

  4. Pada kotak dialog Create Export Task, konfigurasikan parameter-parameter berikut.

    Parameter

    Wajib

    Deskripsi

    Task Name

    Ya

    Nama tugas ekspor. Ini membantu Anda menemukan tugas tersebut nanti.

    Destination SLS

    Ya

    Proyek Simple Log Service, yang merupakan unit manajemen resource.

    SLS Logstore

    Ya

    Logstore tempat Anda ingin mengekspor log. Logstore ini harus memiliki indeks dan tidak boleh berisi entri log apa pun.

    Catatan

    Anda dapat mengklik Sync Dictionary, lalu klik Confirm. DMS secara otomatis mengumpulkan metadata dari Logstore tersebut.

    Feature Module

    Ya

    Pilih modul fitur DMS yang lognya ingin diekspor. Modul-modul ini sesuai dengan modul pada halaman Operation logs. Opsi yang tersedia meliputi Unlimited, Permission, Data Owner, Data Query, Query Result Export, dan Cross-database Query Result Export. Nilai default-nya adalah Unlimited.

    Scheduling Method

    Ya

    Pilih metode penjadwalan untuk pekerjaan ini.

    • One-time: Tugas ekspor hanya dijalankan sekali setelah dibuat.

    • Periodic: Anda dapat memilih untuk mengekspor log ke Logstore secara Daily, Weekly, atau Monthly. Saat pertama kali dijalankan, tugas periodik akan mengekspor semua log operasi yang dihasilkan di DMS dari waktu mulai pembuatan log hingga waktu mulai penjadwalan pertama. Setelah itu, hanya log incremental yang diekspor. Untuk informasi selengkapnya, lihat Recurring schedule.

    Log Time Range

    Tidak

    Catatan

    Parameter ini muncul ketika Anda mengatur Scheduling Method ke One-time.

    Rentang waktu log yang akan diekspor. Jika Anda biarkan kosong, log dari tiga tahun terakhir akan diekspor secara default.

    Log Start Time

    Tidak

    Catatan
    • Parameter ini muncul ketika Anda mengatur Scheduling Method ke Recurring.

    • Tugas recurring tidak memiliki waktu akhir.

    Waktu mulai pencatatan log DMS. Jika Anda biarkan kosong, nilai default-nya adalah tiga tahun sebelum waktu pembuatan tugas.

  5. Klik Confirm. Tugas ekspor dibuat. Sistem juga membuat bidang indeks, seperti dbId, dbName, dan dbUser, di Logstore Anda untuk kueri dan analisis.

    • Untuk tugas one-time, log hanya diekspor sekali. Ketika status tugas berubah menjadi Running Successfully, berarti log telah berhasil diekspor.

      Catatan

      Karena indeks Logstore memerlukan waktu untuk aktif, tugas one-time dimulai sekitar 90 detik setelah dibuat.

    • Untuk tugas recurring, log diekspor beberapa kali. Status tugas ditampilkan sebagai Pending baik sebelum maupun setelah setiap ekspor. Anda dapat melihat log tugas untuk memeriksa apakah eksekusi tertentu berhasil.

    Anda juga dapat melakukan operasi berikut pada kolom Actions untuk suatu tugas.

    • Query: Klik Query untuk menuju halaman SQL Console. Lalu, klik Query untuk melihat log yang diekspor di area hasil eksekusi di bagian bawah halaman.

    • Task Logs: Klik Task Logs untuk melihat informasi seperti waktu mulai dan akhir tugas, jumlah log yang dikirimkan, serta status tugas.

    • Pause: Klik Pause. Pada kotak dialog yang muncul, klik Confirm untuk menjeda tugas recurring.

    • Restart: Klik Restart. Pada kotak dialog yang muncul, klik Confirm untuk menjalankan ulang tugas recurring yang dijeda.

Recurring schedule

Parameter

Deskripsi

Scheduling Cycle

Siklus untuk tugas terjadwal:

  • Daily: Tugas dijalankan sekali per hari. Anda harus menentukan waktu eksekusinya dalam sehari.

  • Weekly: Tugas dijalankan sekali pada hari-hari tertentu dalam seminggu. Anda harus menentukan hari dan waktunya.

  • Monthly: Tugas dijalankan sekali pada tanggal yang ditentukan setiap bulan. Anda harus menentukan tanggal dan waktu pelaksanaannya.

Specified Time

  • Jika siklus penjadwalan bersifat weekly, pilih hari dalam seminggu untuk menjalankan tugas. Anda dapat memilih beberapa hari sekaligus.

  • Jika siklus penjadwalan bersifat monthly, pilih tanggal dalam sebulan untuk menjalankan tugas. Anda dapat memilih beberapa tanggal sekaligus.

Specific Time

Waktu spesifik untuk menjalankan alur tugas.

Misalnya, jika Anda mengatur nilai ini ke 02:55, sistem akan menjalankan tugas pada pukul 02:55 di hari yang ditentukan.

cron expression

Anda tidak perlu mengonfigurasi ini secara manual. Sistem secara otomatis menampilkan ekspresi berdasarkan siklus dan waktu yang Anda konfigurasikan.

Implementasi kode

Anda juga dapat mengekspor log menggunakan kode Java.

Catatan
  • Akun harus memiliki izin GetOpLog untuk DMS, serta izin PutLogs dan CreateIndex untuk SLS.

  • Untuk meningkatkan keamanan, hindari hardcoding AccessKey di kode proyek Anda. Untuk informasi selengkapnya tentang cara mengonfigurasi kredensial, lihat Kelola kredensial akses.

<dependency>
  <groupId>com.aliyun</groupId>
  <artifactId>dms_enterprise20181101</artifactId>
  <version>2.0.0</version>
</dependency>

<dependency>
  <groupId>com.aliyun.openservices</groupId>
  <artifactId>aliyun-log</artifactId>
  <version>0.6.100</version>
</dependency>
package org.example;


import com.aliyun.dms_enterprise20181101.models.GetOpLogResponse;
import com.aliyun.dms_enterprise20181101.models.GetOpLogResponseBody;
import com.aliyun.openservices.log.common.LogItem;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Optional;


public class ExportDmsOperLogExample {

    private static com.aliyun.dms_enterprise20181101.Client dmsClient = null;

    private static com.aliyun.openservices.log.Client slsClient = null;

    public static com.aliyun.credentials.Client getCredentialClient() {
        com.aliyun.credentials.models.Config credentialConfig = new com.aliyun.credentials.models.Config();
        credentialConfig.setType("access_key");
        // Wajib. Contoh ini menunjukkan cara mendapatkan ID AccessKey dari variabel lingkungan.
        credentialConfig.setAccessKeyId(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"));
        // Wajib. Contoh ini menunjukkan cara mendapatkan Rahasia AccessKey dari variabel lingkungan.
        credentialConfig.setAccessKeySecret(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));

        return new com.aliyun.credentials.Client(credentialConfig);
    }

    // Buat client OpenAPI DMS untuk memanggil GetOpLog.
    public static synchronized com.aliyun.dms_enterprise20181101.Client createDmsClient() throws Exception {
        if (dmsClient != null) {
            return dmsClient;
        }
        com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config()
                .setCredential(getCredentialClient());
        // Untuk titik akhir, lihat https://api.aliyun.com/product/dms-enterprise
        config.endpoint = "dms-enterprise.cn-hangzhou.aliyuncs.com";
        dmsClient = new com.aliyun.dms_enterprise20181101.Client(config);
        return dmsClient;
    }

    // Buat client OpenAPI SLS untuk memanggil PutLogs.
    public static synchronized com.aliyun.openservices.log.Client createSlsClient() throws Exception {
        if (slsClient != null) {
            return slsClient;
        }
        com.aliyun.credentials.Client credentialClient = getCredentialClient();
        // Untuk titik akhir, lihat https://api.aliyun.com/product/Sls
        String endpoint = "cn-hangzhou.log.aliyuncs.com";
        slsClient = new com.aliyun.openservices.log.Client(endpoint, credentialClient.getAccessKeyId(), credentialClient.getAccessKeySecret());
        return slsClient;
    }

    // Panggil operasi DMS OpenAPI GetOpLog untuk mendapatkan log operasi.
    public static List<GetOpLogResponseBody.GetOpLogResponseBodyOpLogDetailsOpLogDetail> getLogs(com.aliyun.dms_enterprise20181101.Client client, String startTime, String endTime, Integer pageNumber, Integer pageSize) {
        com.aliyun.dms_enterprise20181101.models.GetOpLogRequest getOpLogRequest = new com.aliyun.dms_enterprise20181101.models.GetOpLogRequest()
                .setStartTime(startTime)
                .setEndTime(endTime)
                .setPageSize(pageSize)
                .setPageNumber(pageNumber);
        com.aliyun.teautil.models.RuntimeOptions runtime = new com.aliyun.teautil.models.RuntimeOptions();
        try {
            GetOpLogResponse response = client.getOpLogWithOptions(getOpLogRequest, runtime);
            return Optional.ofNullable(response.getBody())
                    .map(GetOpLogResponseBody::getOpLogDetails)
                    .map(GetOpLogResponseBody.GetOpLogResponseBodyOpLogDetails::getOpLogDetail)
                    .orElse(new ArrayList<>());
        } catch (Exception e) {
            System.out.println(e.getMessage());
            throw new RuntimeException(e.getMessage());
        }
    }

    // Panggil operasi PutLogs untuk mengimpor log ke Logstore SLS.
    public static void putLogs(com.aliyun.openservices.log.Client client, String project, String logStore, List<GetOpLogResponseBody.GetOpLogResponseBodyOpLogDetailsOpLogDetail> logDetailList) {
        List<LogItem> logItemList = new ArrayList<>();
        for (GetOpLogResponseBody.GetOpLogResponseBodyOpLogDetailsOpLogDetail logDetail : logDetailList) {
            LogItem logItem = new LogItem((int) (new Date().getTime() / 1000));
            logItem.PushBack("module", logDetail.getModule());
            logItem.PushBack("database", logDetail.getDatabase());
            logItem.PushBack("userId", logDetail.getUserId());
            logItem.PushBack("opUserId", String.valueOf(logDetail.getOpUserId()));
            logItem.PushBack("userNick", logDetail.getUserNick());
            logItem.PushBack("opTime", logDetail.getOpTime());
            logItem.PushBack("opContent", logDetail.getOpContent());
            logItem.PushBack("orderId", String.valueOf(logDetail.getOrderId()));
            logItemList.add(logItem);
        }
        try {
            client.PutLogs(project, logStore, "", logItemList, "");
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println(e.getMessage());
            throw new RuntimeException(e.getMessage());
        }
    }

      // Buat indeks. Anda hanya perlu menginisialisasi Logstore sekali saja.
    public static void createIndex(com.aliyun.openservices.log.Client client, String project, String logStore) {
        try {
            GetIndexResponse getIndexResponse = client.GetIndex(project, logStore);
            Index index = getIndexResponse.GetIndex();
            IndexLine indexLine = index.GetLine();
            List<String> indexToken = null;
            if (indexLine != null) {
                indexToken = indexLine.GetToken();
            }
            IndexKeys keys = new IndexKeys();
            List<String> logStoreKeys = List.of("module", "database", "userId", "opUserId",
                    "userNick", "opTime", "opContent", "orderId");
            for (String logStoreKey : logStoreKeys) {
                IndexKey key = new IndexKey();
                key.SetType("text");
                key.SetChn(true);
                key.SetDocValue(false);
                key.SetToken(indexToken);
                keys.AddKey(logStoreKey, key);
                index.SetKeys(keys);
            }
            client.UpdateIndex(project, logStore, index);
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println(e.getMessage());
            throw new RuntimeException(e.getMessage());
        }
    }

    public static void main(String[] args) throws Exception {
        // Waktu mulai log operasi DMS (akurat hingga detik).
        String startStr = "2025-01-10 14:30:00";
        // Waktu akhir log operasi DMS (akurat hingga detik).
        String endStr = "2025-01-13 09:15:00";
        // Nama proyek SLS.
        String project = "project";
        // Nama Logstore SLS.
        String logStore = "logStore";

        // Buat indeks untuk Logstore SLS. Anda hanya perlu membuat indeks untuk Logstore sekali saja.
        createIndex(createSlsClient(), project, logStore);
      
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        LocalDateTime start = LocalDateTime.parse(startStr, formatter);
        LocalDateTime end = LocalDateTime.parse(endStr, formatter);

        if (start.isAfter(end)) {
            throw new IllegalArgumentException("Waktu mulai tidak boleh lebih lambat dari waktu akhir.");
        }

        LocalDateTime current = start;
        
        // Volume log DMS cukup besar. Untuk mencegah timeout permintaan OpenAPI, mintalah log per hari.
        while (!current.isAfter(end)) {
            // Hitung waktu akhir hari ini: Gunakan waktu yang lebih awal antara 23:59:59 hari ini dan waktu akhir keseluruhan.
            LocalDateTime dayEnd = current.toLocalDate().atTime(23, 59, 59);
            if (dayEnd.isAfter(end)) {
                dayEnd = end;
            }

            String segmentStartStr = current.format(formatter);
            String segmentEndStr = dayEnd.format(formatter);

            // Logika bisnis: Pertama, ambil log DMS, lalu impor ke SLS.
            process(segmentStartStr, segmentEndStr, project, logStore);

            // Pindah ke pukul 00:00:00 hari berikutnya.
            current = dayEnd.toLocalDate().plusDays(1).atStartOfDay();
        }
    }

    public static void process(String startTime, String endTime, String project, String logStore) throws Exception {
        int pageNumber = 1;
        int pageSize = 100;
        com.aliyun.dms_enterprise20181101.Client dmsClient = createDmsClient();
        com.aliyun.openservices.log.Client slsClient = createSlsClient();
        List<GetOpLogResponseBody.GetOpLogResponseBodyOpLogDetailsOpLogDetail> logs = getLogs(dmsClient, startTime, endTime, pageNumber, pageSize);
        while(logs.size() >= 100) {
            putLogs(slsClient, project, logStore, logs);
            pageNumber++;
            logs = getLogs(dmsClient, startTime, endTime, pageNumber, pageSize);
        }
    }
}

Referensi

Setelah Anda mengekspor log operasi DMS ke SLS, Anda dapat melakukan kueri dan analisis terhadap log tersebut. Untuk informasi selengkapnya, lihat Kueri dan analisis log operasi DMS di Simple Log Service.