Data Management (DMS) は、データ変換および分析のために、操作ログを Alibaba Cloud Simple Log Service (SLS) にエクスポートする機能をサポートしています。
前提条件
Simple Log Service が有効化されていること。詳細については、「Simple Log Service の有効化」をご参照ください。
Simple Log Service プロジェクトと Logstore が作成されていること。詳細については、「プロジェクトの管理」および「基本的な Logstore の作成」をご参照ください。
[インスタンス管理] ページでプロジェクトが DMS に追加されていること。インスタンスの追加方法の詳細については、「ApsaraDB インスタンスの追加」をご参照ください。
宛先の Logstore は空である必要があります。フルテキストインデックスまたはフィールドインデックスのいずれかを有効にする必要があります。フルテキストインデックスとフィールドインデックスの詳細については、「インデックスの作成」をご参照ください。
背景情報
操作ログには、ユーザーが DMS で実行したすべての操作が記録されます。詳細については、「機能」をご参照ください。
課金
操作手順
- DMS コンソール V5.0 にログインします。
左上隅の
アイコンにポインターを合わせ、 を選択します。説明DMS コンソールを通常モードで使用している場合は、上部のナビゲーションバーで を選択します。
[ログのエクスポート] タブをクリックします。右上隅にある [タスクの作成] をクリックします。
[エクスポートタスクの作成] ダイアログボックスで、パラメーターを設定します。
パラメーター
必須
説明
[タスク名]
はい
エクスポートタスクの名前。後でタスクを見つけやすくなります。
送信先 SLS
はい
Simple Log Service プロジェクト。リソース管理ユニットです。
[SLS Logstore]
はい
ログのエクスポート先となる Logstore。この Logstore にはインデックスが必要で、ログエントリが含まれていない必要があります。
説明[辞書の同期] をクリックし、次に [確認] をクリックできます。DMS は Logstore からメタデータを自動的に収集します。
機能モジュール
はい
エクスポートするログの DMS 機能モジュールを選択します。これらのモジュールは、[操作ログ] ページのモジュールに対応しています。オプションには、[無制限]、[権限]、[データ所有者]、[データクエリ]、[クエリ結果のエクスポート]、[クロスデータベースクエリ結果のエクスポート] があります。デフォルト値は [無制限] です。
スケジューリング方式
はい
このジョブのスケジューリング方法を選択します。
[ワンタイム]:エクスポートタスクは作成後に一度だけ実行されます。
[周期的]:ログを [毎日]、[毎週]、または [毎月] の基準で Logstore にエクスポートするように選択できます。定期的なタスクが初めて実行されると、ログ生成の開始時刻から最初のスケジューリングの開始時刻までに DMS で生成されたすべての操作ログがエクスポートされます。その後は増分ログのみがエクスポートされます。詳細については、「定期スケジュール」をご参照ください。
ログの時間範囲
いいえ
説明このパラメーターは、[スケジューリング方法] を [ワンタイム] に設定した場合に表示されます。
エクスポートするログの時間範囲。空白のままにすると、デフォルトで過去 3 年間のログがエクスポートされます。
ログ開始時刻
いいえ
説明このパラメーターは、[スケジューリング方法] を [定期的] に設定した場合に表示されます。
定期的なタスクには終了時刻がありません。
DMS ログ記録の開始時刻。空白のままにすると、デフォルト値はタスク作成時刻の 3 年前になります。
[確認] をクリックします。エクスポートタスクが作成されます。システムはまた、クエリと分析のために、dbId、dbName、dbUser などのインデックス付きフィールドを Logstore に作成します。
ワンタイムタスクの場合、ログは一度だけエクスポートされます。タスクのステータスが [正常に実行] に変わると、ログは正常にエクスポートされています。
説明Logstore のインデックスが有効になるまでに時間がかかるため、ワンタイムタスクは作成後約 90 秒で開始されます。
定期的なタスクの場合、ログは複数回エクスポートされます。タスクのステータスは、各エクスポートの前後で [保留中] と表示されます。タスクログを表示して、特定の実行が成功したかどうかを確認できます。
タスクの [操作] 列で、次の操作を実行することもできます。
[クエリ]:[クエリ] をクリックして SQL コンソールページに移動します。次に、[クエリ] をクリックして、ページ下部の実行結果エリアでエクスポートされたログを表示します。
[タスクログ]:[タスクログ] をクリックして、タスクの開始時刻と終了時刻、配信されたログの数、タスクのステータスなどの情報を表示します。
[一時停止]:[一時停止] をクリックします。表示されるダイアログボックスで [確認] をクリックして、定期的なタスクを一時停止します。
[再起動]:[再起動] をクリックします。表示されるダイアログボックスで [確認] をクリックして、一時停止した定期的なタスクを再起動します。
定期スケジュール
パラメーター | 説明 |
[スケジューリングサイクル] | スケジュールされたタスクのサイクル:
|
指定時刻 |
|
指定時刻 | タスクフローを実行する特定の時刻。 たとえば、これを 02:55 に設定すると、システムは指定された日に 02:55 にタスクを実行します。 |
Cron 式 | これを手動で設定する必要はありません。システムは、設定したサイクルと時間に基づいて式を自動的に表示します。 |
コード実装
Java コードを使用してログをエクスポートすることもできます。
アカウントには、DMS の
GetOpLog権限と、SLS のPutLogsおよびCreateIndex権限が必要です。セキュリティを向上させるため、プロジェクトコードに AccessKey をハードコーディングしないでください。認証情報の設定方法の詳細については、「アクセス認証情報の管理」をご参照ください。
<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");
// 必須。この例では、環境変数から AccessKey ID を取得する方法を示します。
credentialConfig.setAccessKeyId(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"));
// 必須。この例では、環境変数から AccessKey Secret を取得する方法を示します。
credentialConfig.setAccessKeySecret(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
return new com.aliyun.credentials.Client(credentialConfig);
}
// DMS OpenAPI クライアントを作成して 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());
// エンドポイントについては、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;
}
// SLS OpenAPI クライアントを作成して PutLogs を呼び出します。
public static synchronized com.aliyun.openservices.log.Client createSlsClient() throws Exception {
if (slsClient != null) {
return slsClient;
}
com.aliyun.credentials.Client credentialClient = getCredentialClient();
// エンドポイントについては、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;
}
// DMS OpenAPI の GetOpLog 操作を呼び出して操作ログを取得します。
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());
}
}
// PutLogs 操作を呼び出して、ログを SLS Logstore にインポートします。
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());
}
}
// インデックスを作成します。Logstore の初期化は一度だけ必要です。
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 {
// DMS 操作ログの開始時刻 (秒単位まで正確)。
String startStr = "2025-01-10 14:30:00";
// DMS 操作ログの終了時刻 (秒単位まで正確)。
String endStr = "2025-01-13 09:15:00";
// SLS プロジェクトの名前。
String project = "project";
// SLS Logstore の名前。
String logStore = "logStore";
// SLS Logstore のインデックスを作成します。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("The start time cannot be later than the end time.");
}
LocalDateTime current = start;
// DMS ログの量は膨大です。OpenAPI リクエストのタイムアウトを防ぐため、一度に 1 日分のログをリクエストします。
while (!current.isAfter(end)) {
// 当日の終了時刻を計算します:当日の 23:59:59 と全体の終了時刻のうち、早い方を使用します。
LocalDateTime dayEnd = current.toLocalDate().atTime(23, 59, 59);
if (dayEnd.isAfter(end)) {
dayEnd = end;
}
String segmentStartStr = current.format(formatter);
String segmentEndStr = dayEnd.format(formatter);
// ビジネスロジック:まず DMS ログを取得し、次に SLS にインポートします。
process(segmentStartStr, segmentEndStr, project, logStore);
// 翌日の 00:00:00 に移動します。
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);
}
}
}
関連ドキュメント
DMS 操作ログを SLS にエクスポートした後、クエリと分析を行うことができます。詳細については、「Simple Log Service での DMS 操作ログのクエリと分析」をご参照ください。