O Simple Log Service oferece suporte a atualizações e exclusões no nível de linha para dados já gravados em um Logstore. Ative esse recurso ao criar o Logstore e use a OpenAPI ou o SDK do Python para modificar e excluir dados de log por RowID ou por consulta.
Visão geral
Por padrão, um Logstore segue um modelo imutável e apenas de adição (append-only). Após a gravação dos dados no Logstore, não é possível modificá-los ou excluí-los localmente.
Alguns cenários exigem a modificação ou exclusão de dados existentes em um Logstore:
Correção retroativa de campos: atualize campos de negócio, como status de pedido, rótulos de risco ou resultados de pontuação, após a gravação do log original.
Limpeza de dados de teste: remova registros de teste ou canário de um Logstore de produção.
Reparo de registro único: corrija uma entrada de log específica durante um fluxo de trabalho de replay de negócios ou reconciliação.
O Simple Log Service fornece capacidades de atualização e exclusão no nível de linha por Logstore. Modifique ou exclua registros individuais usando RowID ou modifique e exclua registros em lote por consulta.
Observe os pontos abaixo antes de usar este recurso:
Este recurso está disponível apenas para Logstores recém-criados. Defina
enableModifycomotruedurante a criação do Logstore. Não é possível ativar essa funcionalidade em um Logstore existente.Uma vez ativado, o recurso não pode ser desativado. Planeje adequadamente antes de criar o Logstore.
Todas as operações de modificação e exclusão são irreversíveis. Não existe mecanismo nativo de rollback.
Consumidores em tempo real (LogHub) e tarefas de entrega não recebem notificações sobre modificações ou exclusões. Apenas caminhos de leitura baseados em consulta (Search, SQL, SPL) retornam os dados mais recentes.
Conceitos principais
RowID
O RowID é um identificador lógico que o Simple Log Service atribui a cada entrada de log em um Logstore com atualização e exclusão no nível de linha ativadas. Todas as operações de modificação e exclusão usam o RowID para localizar o registro alvo.
Formato: o RowID é gerado no momento da gravação e não pode ser personalizado. Trate-o como um identificador opaco.
Estabilidade: o RowID permanece inalterado durante todo o ciclo de vida de um registro de log, mesmo após a modificação do registro.
Visibilidade: os resultados da consulta incluem automaticamente o campo integrado
__rowid__. Este nome de campo é reservado e não pode ser usado nas configurações de índice.
AffectedRows
Cada solicitação bem-sucedida de modificação ou exclusão retorna AffectedRows, que indica o número de registros de log efetivamente afetados. Use esse valor para verificar se a operação foi executada conforme o esperado.
O valor AffectedRows é retornado no corpo da resposta HTTP como x-log-affectedrows. No SDK do Python, leia-o por meio de resp.affected_rows.
Pré-requisitos
Certifique-se de que os seguintes requisitos foram atendidos:
Um projeto do Simple Log Service. Para mais informações, consulte Criar um projeto.
Um Logstore com o parâmetro
enableModifydefinido comotrue. Consulte Ativar o recurso neste tópico.As permissões RAM
log:UpdateLogStoreLogselog:DeleteLogStoreLogsconcedidas ao chamador. Consulte Permissões RAM necessárias neste tópico.(Condicional) Se você usar operações baseadas em consulta, os campos referenciados na consulta devem ter índices configurados.
Ativar o recurso
Para usar a atualização e exclusão no nível de linha, defina o parâmetro enableModify como true ao chamar a API CreateLogStore.
Defina
enableModifyapenas ao criar um novo Logstore. Não é possível ativar esse recurso em um Logstore existente.Após definir
enableModifycomotrue, não será possível desativá-lo.Esse recurso só pode ser ativado via OpenAPI ou SDK. O console do Simple Log Service não oferece suporte a esta funcionalidade.
Ativar via OpenAPI
Chame a API CreateLogStore e defina enableModify como true no corpo da solicitação:
POST /logstores HTTP/1.1
Host: <project>.<endpoint>
Content-Type: application/json
{
"logstoreName": "my-logstore",
"ttl": 30,
"shardCount": 1,
"enableModify": true
}
Após a criação do Logstore, chame a API GetLogStore para verificar. Se a resposta contiver "enableModify": true, o recurso estará ativo.
Ativar via SDK do Python
from aliyun.log import LogClient
# Obtain AccessKey credentials from environment variables.
client = LogClient(endpoint, access_key_id, access_key)
client.create_logstore(
project_name="my-project",
logstore_name="my-logstore",
ttl=30,
shard_count=1,
enable_modify=True,
)
Modificar e excluir dados
Dois métodos estão disponíveis para modificar e excluir dados de log:
|
Método |
Cenário |
Máximo de linhas por solicitação |
|
Por RowID |
Indicado quando você conhece o RowID exato do registro alvo e deseja modificá-lo ou excluí-lo com precisão. |
1 |
|
Por consulta |
Recomendado para modificar ou excluir em lote todos os registros que correspondem a uma condição de consulta. |
10.000 |
Método 1: Modificar e excluir por RowID
Use este método quando já possuir o RowID de um registro específico, geralmente obtido a partir de um resultado de consulta anterior.
Modificar um único registro
Especifique apenas os campos que deseja alterar. Os campos não incluídos permanecerão inalterados.
from aliyun.log import LogClient, LogItem
client = LogClient(endpoint, access_key_id, access_key)
# Specify only the fields to update. Unspecified fields keep their original values.
new_item = LogItem(
contents=[("status", "REFUNDED")],
)
resp = client.update_logs(
project="my-project",
logstore="my-logstore",
rowid=rowid,
log_item=new_item,
)
print(f"Affected rows: {resp.affected_rows}")
Excluir um único registro
resp = client.delete_logs_v2(
project="my-project",
logstore="my-logstore",
rowid=rowid,
)
print(f"Affected rows: {resp.affected_rows}")
A exclusão do mesmo registro múltiplas vezes é idempotente. A operação não retorna erro, mas
affected_rowsdevolve o valor0.Use
delete_logs_v2para exclusão síncrona. O método legadodelete_logsrealiza uma exclusão lógica assíncrona (soft delete), que não é suportada em Logstores comenableModifyativado.
Método 2: Modificar e excluir por consulta
Use este método para modificar ou excluir em lote registros que correspondam a uma condição de consulta. A consulta é executada no servidor e a modificação ou exclusão é aplicada a todos os registros correspondentes.
Esta operação é irreversível.
Em caso de falha parcial da operação, as linhas já modificadas ou excluídas não sofrem rollback. A resposta retorna apenas o número de linhas efetivamente afetadas.
Antes de executar, use Search ou SQL para visualizar os registros que correspondem à sua condição de consulta e validar o escopo.
Operações em lote baseadas em consulta consomem muitos recursos. Reduza o intervalo de tempo ou refine a condição de consulta para permanecer dentro do limite de 10.000 linhas por solicitação.
Os campos referenciados na consulta precisam ter índices configurados. Caso contrário, a consulta não retornará resultados.
Excluir por consulta
resp = client.delete_logs_v2(
project="my-project",
logstore="my-logstore",
from_time=1716537600,
to_time=1716624000,
query='level: DEBUG',
)
print(f"Deleted rows: {resp.affected_rows}")
Modificar por consulta
Especifique tanto a condição de consulta quanto os valores dos campos a serem atualizados. Todos os registros correspondentes serão atualizados com os mesmos valores de campo.
resp = client.update_logs(
project="my-project",
logstore="my-logstore",
from_time=1716537600,
to_time=1716624000,
query='order_id: 12345 and status: "PENDING"',
update_fields={"status": "REFUNDED", "refund_at": "2026-05-25T10:00:00Z"},
)
print(f"Modified rows: {resp.affected_rows}")
Se você passar tanto
rowidquantoqueryna mesma solicitação,rowidterá precedência e o parâmetroqueryserá ignorado.Operações baseadas em consulta exigem que os dados estejam visíveis para consulta. Pode haver um atraso de alguns segundos entre a ingestão dos dados e sua disponibilidade para consulta.
Verificar resultados
Verifique o resultado após cada operação de modificação ou exclusão para confirmar o sucesso conforme o esperado.
-
Verificar AffectedRows: cada solicitação retorna
AffectedRowsna resposta (cabeçalho HTTPx-log-affectedrowsouresp.affected_rowsno SDK do Python). Compare esse valor com o número esperado de registros:AffectedRows > 0e corresponde ao esperado: a operação foi bem-sucedida.AffectedRows = 0: nenhum registro correspondeu à condição ou o registro já havia sido excluído. Revise sua consulta ou RowID.AffectedRowsestá abaixo do esperado: pode ter ocorrido uma falha parcial. Execute novamente a operação para os registros restantes.
Executar uma consulta subsequente: para operações em lote, execute uma consulta Search ou SQL após a operação para confirmar que os dados refletem o estado esperado. Isso é especialmente importante quando
AffectedRowsfor menor que o esperado.
Consistência de dados
As operações de modificação e exclusão entram em vigor de forma síncrona. Após o sucesso de uma solicitação, as consultas subsequentes (Search, SQL e SPL) retornam os resultados atualizados.
Tenha em mente os seguintes comportamentos:
O consumo em tempo real não é afetado: consumidores do LogHub e tarefas de entrega (como entrega para OSS ou MaxCompute) operam no fluxo de gravação original. Eles não refletem modificações ou exclusões. Apenas caminhos de leitura baseados em consulta retornam os dados mais recentes.
Operações baseadas em consulta não são atômicas: o servidor processa cada registro correspondente individualmente. Se ocorrer uma falha parcial, os registros já processados não sofrem rollback. A resposta retorna o número de linhas efetivamente afetadas.
Permissões RAM necessárias
O usuário ou função RAM que chamar a API de modificação ou exclusão deve possuir as seguintes permissões:
|
Ação |
Descrição |
|
|
Modificar dados de log por RowID ou por consulta. |
|
|
Excluir dados de log por RowID ou por consulta. |
Formato do ARN do recurso:
acs:log:<region>:<account-id>:project/<project-name>/logstore/<logstore-name>
Recomendamos criar um usuário ou função RAM dedicado para operações de modificação e exclusão, especialmente para exclusões em lote baseadas em consulta. Use o ActionTrail para auditar essas operações.
Limites de uso
|
Item |
Descrição |
|
Apenas novos Logstores |
É obrigatório definir |
|
Não pode ser desativado |
Após ativar este recurso, não é possível desativá-lo. |
|
Máximo de linhas por operação baseada em consulta |
10.000 linhas por solicitação. Se a consulta corresponder a mais de 10.000 registros, a solicitação será rejeitada. Reduza o intervalo de tempo ou refine a condição de consulta. |
|
Requisito de índice |
Campos usados como condições de consulta devem ter índices configurados. Operações por RowID não exigem índices de campos de negócio. |
|
Sem reconstrução de índice |
Após ativar este recurso, o Logstore não suporta reconstrução de índices. |
|
Sem exclusão lógica (soft delete) |
Com este recurso ativado, a exclusão lógica assíncrona não é suportada. Use a interface de exclusão síncrona ( |
|
|
Não é permitido usar |
|
Consumidores em tempo real não notificados |
Consumidores do LogHub e tarefas de entrega (como entrega para OSS ou MaxCompute) não recebem notificações sobre modificações ou exclusões. Apenas caminhos de leitura baseados em consulta (Search, SQL, SPL) retornam os dados mais recentes. |
Faturamento
Operações de modificação: atualmente, operações de modificação não são cobradas. Futuramente, as cobranças serão baseadas no espaço de armazenamento gerado pelos dados modificados.
Operações de exclusão: operações de exclusão não incorrem em cobranças adicionais.
Perguntas frequentes
Posso ativar este recurso em um Logstore existente?
Não. Este recurso requer um formato de armazenamento disponível apenas no momento da criação do Logstore. Crie um novo Logstore com enableModify=true e migre os dados históricos por meio de transformação de dados ou do SDK.
As operações de modificação e exclusão afetam consumidores em tempo real?
Não. Consumidores do LogHub e tarefas de entrega operam no fluxo de gravação original e não refletem modificações ou exclusões. Apenas caminhos de leitura baseados em consulta (Search, SQL e SPL) retornam os dados mais recentes.
As modificações e exclusões ficam visíveis imediatamente?
Sim. Após o sucesso de uma solicitação, as consultas subsequentes retornam os dados atualizados. O valor AffectedRows na resposta indica quantos registros foram efetivamente modificados ou excluídos.
Posso reverter uma modificação ou exclusão acidental?
Não. Não existe mecanismo nativo de rollback. Visualize os registros correspondentes com Search ou SQL antes de executar uma operação de modificação ou exclusão. Recomendamos usar usuários RAM dedicados com permissões restritas e ativar o ActionTrail para auditoria.
A exclusão libera espaço de armazenamento imediatamente?
A exclusão é uma operação lógica. O armazenamento subjacente é retido até que o TTL do Logstore expire ou uma compactação em segundo plano seja executada. Todos os caminhos de consulta filtram os registros excluídos, portanto, os dados excluídos ficam invisíveis para os usuários.