Data Management (DMS) dapat mengekspor log operasi ke Simple Log Service (SLS) untuk penyimpanan terpusat, kueri, transformasi data, dan analisis.
Prasyarat
Sebelum memulai, pastikan Anda telah:
Mengaktifkan akun Simple Log Service. Untuk informasi selengkapnya, lihat Aktifkan Simple Log Service.
Memiliki proyek SLS dan Logstore. Untuk informasi selengkapnya, lihat Kelola proyek dan Buat Logstore dasar.
Instans basis data ditambahkan ke DMS melalui halaman Instance Management. Untuk informasi selengkapnya, lihat Menambahkan instans ApsaraDB.
Memiliki Logstore tanpa entri log yang ada serta telah mengaktifkan indeks teks penuh atau indeks bidang. Untuk informasi selengkapnya, lihat Buat indeks.
(Hanya untuk implementasi Java) Memiliki izin
GetOpLoguntuk DMS, serta izinPutLogsdanCreateIndexuntuk SLS.
Penagihan
Mengekspor log operasi DMS ke SLS tidak dikenai biaya.
Setelah log dikumpulkan di SLS, biaya akan dikenakan berdasarkan metode penagihan Logstore: jika Logstore menggunakan metode penagihan Pay-by-feature, Anda akan dikenai biaya untuk storage space, traffic baca, permintaan, transformasi data, dan pengiriman data. 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. Untuk informasi selengkapnya, lihat dokumentasi penagihan.
Ekspor log menggunakan Java
Sebagai alternatif dari konsol, ekspor log secara terprogram menggunakan SDK Java. Kode ini memanggil API GetOpLog DMS untuk mengambil log, lalu menulisnya ke SLS menggunakan PutLogs.
(Hanya untuk implementasi Java) Memiliki izin
GetOpLoguntuk DMS, serta izinPutLogsdanCreateIndexuntuk SLS.Hindari hardcoding AccessKey dalam kode proyek Anda. Untuk informasi lebih lanjut tentang mengonfigurasi kredensial secara aman, lihat Kelola kredensial akses.
Tambahkan dependensi Maven berikut:
<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");
// Dapatkan ID AccessKey dari variabel lingkungan.
credentialConfig.setAccessKeyId(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"));
// Dapatkan Rahasia AccessKey dari variabel lingkungan.
credentialConfig.setAccessKeySecret(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
return new com.aliyun.credentials.Client(credentialConfig);
}
// Buat klien 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 klien 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 GetOpLog untuk mengambil log operasi DMS dalam rentang waktu dan halaman tertentu.
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 PutLogs untuk menulis 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 dan akhir untuk log operasi DMS (akurat hingga detik).
String startStr = "2025-01-10 14:30:00";
String endStr = "2025-01-13 09:15:00";
// Nama proyek dan Logstore SLS.
String project = "project";
String logStore = "logStore";
// Inisialisasi indeks Logstore. Hanya perlu dijalankan sekali per Logstore.
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 bisa sangat besar. Untuk menghindari timeout API, kode mengambil log satu hari sekaligus.
while (!current.isAfter(end)) {
// Untuk setiap hari, gunakan 23:59:59 atau waktu akhir keseluruhan, mana yang lebih awal.
LocalDateTime dayEnd = current.toLocalDate().atTime(23, 59, 59);
if (dayEnd.isAfter(end)) {
dayEnd = end;
}
String segmentStartStr = current.format(formatter);
String segmentEndStr = dayEnd.format(formatter);
// Ambil log dari DMS dan tulis ke SLS.
process(segmentStartStr, segmentEndStr, project, logStore);
// Lanjutkan ke awal 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);
}
}
}Langkah berikutnya
Setelah mengekspor log operasi DMS ke SLS, lakukan kueri dan analisis terhadap log tersebut. Untuk informasi selengkapnya, lihat Kueri dan analisis log operasi DMS di Simple Log Service.