O Data Management (DMS) permite exportar logs de operação para o Simple Log Service (SLS) para armazenamento centralizado, consulta, transformação de dados e análise.
Pré-requisitos
Antes de começar, verifique se você tem:
Uma conta do Simple Log Service ativada. Para mais informações, consulte Ativar o Simple Log Service.
Um projeto do SLS e um Logstore. Para mais informações, consulte Gerenciar projetos e Criar um Logstore básico.
O projeto do SLS adicionado ao DMS na página Instances. Para mais informações, consulte Adicionar uma instância do ApsaraDB.
Um Logstore sem entradas de log e com índice de texto completo ou índice de campo ativado. Para mais informações, consulte Criar um índice.
(Apenas para implementação em Java) A permissão
GetOpLogno DMS, além das permissõesPutLogseCreateIndexno SLS.
Faturamento
A exportação de logs de operação do DMS para o SLS é gratuita.
-
Após a coleta dos logs no SLS, as cobranças seguem o método de faturamento do Logstore:
Se o Logstore usar o método Pay-by-feature, haverá cobrança por espaço de armazenamento, tráfego de leitura, solicitações, transformação de dados e envio de dados. Para mais detalhes, consulte a documentação de faturamento.
Se o Logstore usar o método Pay-by-ingested-data, a cobrança será baseada na quantidade de dados brutos ingeridos. Para mais detalhes, consulte a documentação de faturamento.
Agendamento recorrente
Parâmetro | Descrição |
Scheduling Cycle | Ciclo da tarefa agendada:
|
Specified Time |
|
Specific Time | Horário exato para executar o fluxo da tarefa. Por exemplo, se definido como 02:55, o sistema executará a tarefa às 02:55 nos dias especificados. |
cron expression | Configuração manual desnecessária. O sistema exibe automaticamente a expressão com base no ciclo e no horário definidos. |
Procedimento
Faça login no DMS 5.0.
-
Passe o ponteiro sobre o ícone
no canto superior esquerdo e escolha .NotaSe estiver usando o console do DMS no modo normal, escolha na barra de navegação superior.
Clique em Export Logs. No canto superior direito, clique em Create Task.
-
Na caixa de diálogo Create Export Task, configure os parâmetros.
Item de configuração
Obrigatório
Descrição
Task Name
Sim
Nome da tarefa de exportação. Facilita a localização posterior da tarefa.
Destination SLS
Sim
O Project é a unidade de gerenciamento de recursos no Simple Log Service.
SLS Logstore
Sim
Logstore de destino para a exportação dos logs. Este Logstore deve ter um índice e não conter entradas de log.
NotaClique em Sync Dictionary e depois em Confirm. O DMS coletará automaticamente os metadados do Logstore.
Feature Module
Sim
Selecione os módulos de recurso do DMS cujos logs deseja exportar. Estes correspondem aos módulos da página Operation logs. As opções incluem Unlimited, Permission, Data Owner, Data Query, Query Result Export e Cross-database Query Result Export. O valor padrão é Unlimited.
Scheduling Method
Sim
Escolha o método de agendamento para esta tarefa.
One-time: A tarefa de exportação executa apenas uma vez após a criação.
Periodic: Permite exportar logs para o Logstore diariamente (Daily), semanalmente (Weekly) ou mensalmente (Monthly). Na primeira execução de uma tarefa periódica, todos os logs de operação gerados no DMS desde o início do registro até o momento do primeiro agendamento são exportados. Nas execuções seguintes, apenas os logs incrementais são exportados. Para mais informações, consulte Agendamento recorrente.
Log Time Range
Não
NotaEste parâmetro aparece quando o Scheduling Method é definido como One-time.
Intervalo de tempo dos logs a exportar. Se deixado em branco, os logs dos últimos três anos são exportados por padrão.
Log Start Time
Não
NotaEste parâmetro aparece quando o Scheduling Method é definido como Recurring.
Tarefas recorrentes não têm horário de término.
Horário inicial para o registro de logs do DMS. Se deixado em branco, o valor padrão é três anos antes da criação da tarefa.
-
Clique em Confirm. Uma tarefa de exportação é criada. O sistema também cria campos indexados, como dbId, dbName e dbUser, no Logstore para consulta e análise.
-
Em tarefas únicas, os logs são exportados apenas uma vez. Quando o status da tarefa mudar para Running Successfully, a exportação terá sido concluída com sucesso.
NotaComo o índice do Logstore leva algum tempo para entrar em vigor, a tarefa única inicia aproximadamente 90 segundos após a criação.
Em tarefas recorrentes, os logs são exportados várias vezes. O status da tarefa é exibido como Pending tanto antes quanto depois de cada exportação. Consulte os logs da tarefa para verificar se uma execução específica foi bem-sucedida.
Você também pode executar as seguintes operações na coluna Actions de uma tarefa.
Query: Clique em Query para acessar a página SQL Console. Em seguida, clique em Query para visualizar os logs exportados na área de resultados de execução, na parte inferior da página.
Task Logs: Clique em Task Logs para ver informações como horários de início e fim da tarefa, quantidade de logs entregues e status da tarefa.
Pause: Clique em Pause. Na caixa de diálogo exibida, clique em Confirm para pausar a tarefa recorrente.
Restart: Clique em Restart. Na caixa de diálogo exibida, clique em Confirm para reiniciar uma tarefa recorrente pausada.
-
Procedimento
Faça login no DMS 5.0.
-
Passe o ponteiro sobre o ícone
no canto superior esquerdo e escolha .NotaSe estiver usando o console do DMS no modo normal, escolha na barra de navegação superior.
Clique em Export Logs. No canto superior direito, clique em Create Task.
-
Na caixa de diálogo Create Export Task, configure os parâmetros.
Parâmetro
Obrigatório
Descrição
Task Name
Sim
Nome da tarefa de exportação.
Destination SLS
Sim
Projeto do SLS para onde os logs serão exportados.
SLS Logstore
Sim
Logstore de destino. O Logstore deve ter um índice ativado e não conter entradas de log.
NotaPara permitir que o DMS colete metadados do Logstore automaticamente, clique em Sync Dictionary e depois em Confirm.
Feature Module
Sim
Módulos do DMS cujos logs você deseja exportar. Opções: Unlimited, Permission, Data Owner, Data Query, Query Result Export e Cross-database Query Result Export. Padrão: Unlimited (todos os módulos).
Scheduling Method
Sim
Escolha o método de agendamento para esta tarefa.
One-time: A tarefa de exportação executa apenas uma vez após a criação.
Periodic: Permite exportar logs para o Logstore diariamente (Daily), semanalmente (Weekly) ou mensalmente (Monthly). Na primeira execução de uma tarefa periódica, todos os logs de operação gerados no DMS desde o início do registro até o momento do primeiro agendamento são exportados. Nas execuções seguintes, apenas os logs incrementais são exportados. Para mais informações, consulte Agendamento recorrente.
Log Time Range
Não
NotaEste parâmetro aparece quando o Scheduling Method é definido como One-time.
Intervalo de tempo dos logs a exportar. Se deixado em branco, os logs dos últimos três anos são exportados por padrão.
Log Start Time
Não
NotaEste parâmetro aparece quando o Scheduling Method é definido como Recurring.
Tarefas recorrentes não têm horário de término.
Horário inicial para o registro de logs do DMS. Se deixado em branco, o valor padrão é três anos antes da criação da tarefa.
-
Clique em Confirm. Uma tarefa de exportação é criada. O sistema também cria campos indexados, como dbId, dbName e dbUser, no Logstore para consulta e análise.
-
Em tarefas únicas, os logs são exportados apenas uma vez. Quando o status da tarefa mudar para Running Successfully, a exportação terá sido concluída com sucesso.
NotaComo o índice do Logstore leva algum tempo para entrar em vigor, a tarefa única inicia aproximadamente 90 segundos após a criação.
Em tarefas recorrentes, os logs são exportados várias vezes. O status da tarefa é exibido como Pending tanto antes quanto depois de cada exportação. Consulte os logs da tarefa para verificar se uma execução específica foi bem-sucedida.
Você também pode executar as seguintes operações na coluna Actions de uma tarefa.
Query: Abre a página SQL Console. Clique em Query para visualizar os logs exportados na área de resultados de execução.
Task Logs: Exibe os horários de início e fim da tarefa, a quantidade de logs entregues e o status da tarefa.
Pause: Pausa uma tarefa recorrente. Clique em Confirm na caixa de diálogo.
Restart: Reinicia uma tarefa recorrente pausada. Clique em Confirm na caixa de diálogo.
-
Agendamento recorrente
|
Parâmetro |
Descrição |
|
Scheduling Cycle |
Ciclo de recorrência: Daily (uma vez por dia em um horário específico), Weekly (em dias específicos da semana) ou Monthly (em dias específicos do mês). |
|
Specified Time |
Dias para executar a tarefa. Para tarefas semanais, selecione um ou mais dias da semana. Para tarefas mensais, selecione um ou mais dias do mês. |
|
Specific Time |
Horário do dia para executar a tarefa. Por exemplo, |
|
cron expression |
O DMS gera a expressão cron automaticamente com base nas configurações de ciclo e horário. Nenhuma entrada manual é necessária. |
Exportar logs usando Java
Como alternativa ao console, exporte logs programaticamente usando o SDK do Java. O código chama a API GetOpLog do DMS para recuperar os logs e, em seguida, grava-os no SLS usando PutLogs.
(Apenas para implementação em Java) A permissão
GetOpLogno DMS, além das permissõesPutLogseCreateIndexno SLS.Evite codificar rigidamente (hardcode) um AccessKey no código do seu projeto. Para mais informações sobre como configurar credenciais com segurança, consulte Gerenciar credenciais.
Adicione as seguintes dependências do Maven:
<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");
// Obtain the AccessKey ID from an environment variable.
credentialConfig.setAccessKeyId(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"));
// Obtain the AccessKey secret from an environment variable.
credentialConfig.setAccessKeySecret(System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
return new com.aliyun.credentials.Client(credentialConfig);
}
// Create a DMS client to call 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());
// For the endpoint, see 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;
}
// Create an SLS client to call PutLogs.
public static synchronized com.aliyun.openservices.log.Client createSlsClient() throws Exception {
if (slsClient != null) {
return slsClient;
}
com.aliyun.credentials.Client credentialClient = getCredentialClient();
// For the endpoint, see 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;
}
// Call GetOpLog to retrieve DMS operation logs for the specified time range and page.
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());
}
}
// Call PutLogs to write logs to the 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());
}
}
// Create an index. You only need to initialize a Logstore once.
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 {
// The start and end times for the DMS operation logs (accurate to the second).
String startStr = "2025-01-10 14:30:00";
String endStr = "2025-01-13 09:15:00";
// The SLS project and Logstore names.
String project = "project";
String logStore = "logStore";
// Initialize the Logstore index. Only needs to run once 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("The start time cannot be later than the end time.");
}
LocalDateTime current = start;
// DMS log volumes can be large. To avoid API timeouts, the code fetches logs one day at a time.
while (!current.isAfter(end)) {
// For each day, use either 23:59:59 or the overall end time, whichever comes first.
LocalDateTime dayEnd = current.toLocalDate().atTime(23, 59, 59);
if (dayEnd.isAfter(end)) {
dayEnd = end;
}
String segmentStartStr = current.format(formatter);
String segmentEndStr = dayEnd.format(formatter);
// Fetch logs from DMS and write them to SLS.
process(segmentStartStr, segmentEndStr, project, logStore);
// Advance to the start of the next day.
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);
}
}
}
Próximos passos
Após exportar os logs de operação do DMS para o SLS, consulte-os e analise-os. Para mais informações, consulte Consultar e analisar logs de operação do DMS no Simple Log Service.