Simple Log Service memungkinkan Anda memodifikasi dan menghapus data yang telah ditulis ke Logstore. Topik ini menjelaskan cara mengaktifkan fitur pembaruan dan penghapusan tingkat baris (row-level), serta cara menggunakan OpenAPI atau Python SDK untuk memodifikasi dan menghapus data log berdasarkan RowID atau kueri.
Ikhtisar
Secara default, Logstore mengikuti model hanya-tambah (append-only) dan tidak dapat diubah (immutable). Setelah data ditulis ke Logstore, data tersebut tidak dapat dimodifikasi atau dihapus secara langsung.
Beberapa skenario memerlukan modifikasi atau penghapusan data yang sudah ada di Logstore:
Koreksi bidang retroaktif: Memperbarui bidang bisnis seperti status pesanan, label risiko, atau hasil penilaian setelah log awal ditulis.
Pembersihan data uji: Menghapus catatan uji atau canary dari Logstore produksi.
Perbaikan catatan tunggal: Memperbaiki entri log tertentu selama alur kerja replay atau rekonsiliasi bisnis.
Untuk mengatasi skenario tersebut, Simple Log Service menyediakan kemampuan pembaruan dan penghapusan tingkat baris per Logstore. Anda dapat memodifikasi atau menghapus catatan individual berdasarkan RowID, atau memodifikasi/menghapus catatan secara batch berdasarkan kueri.
Perhatikan hal-hal berikut sebelum menggunakan fitur ini:
Fitur ini hanya tersedia untuk Logstore yang baru dibuat. Atur
enableModifyketruesaat membuat Logstore. Anda tidak dapat mengaktifkan fitur ini untuk Logstore yang sudah ada.Setelah diaktifkan, fitur ini tidak dapat dinonaktifkan. Rencanakan dengan matang sebelum membuat Logstore.
Semua operasi modifikasi dan penghapusan bersifat tidak dapat dikembalikan. Tidak ada mekanisme rollback bawaan.
Konsumen real-time (LogHub) dan tugas pengiriman tidak diberi notifikasi tentang modifikasi atau penghapusan. Hanya jalur pembacaan berbasis kueri (Search, SQL, SPL) yang mengembalikan data terbaru.
Konsep inti
RowID
RowID adalah pengidentifikasi logis catatan yang diberikan oleh Simple Log Service ke setiap entri log yang ditulis ke Logstore dengan fitur pembaruan dan penghapusan tingkat baris diaktifkan. Semua operasi modifikasi dan penghapusan menggunakan RowID untuk menemukan catatan target.
Format: Simple Log Service menghasilkan RowID saat penulisan. Anda tidak dapat menyesuaikan atau membuat RowID sendiri. Perlakukan sebagai pengidentifikasi tak transparan (opaque).
Stabilitas: RowID tetap tidak berubah sepanjang siklus hidup catatan log. Bahkan setelah Anda memodifikasi catatan, RowID yang sama tetap merujuk ke catatan tersebut.
Visibilitas: Hasil kueri dari Logstore dengan fitur ini diaktifkan secara otomatis menyertakan bidang bawaan
__rowid__. Ini adalah nama bidang yang dicadangkan dan tidak dapat digunakan dalam konfigurasi indeks.
AffectedRows
Setiap permintaan modifikasi atau penghapusan yang berhasil mengembalikan AffectedRows, yang menunjukkan jumlah catatan log yang benar-benar terpengaruh oleh operasi tersebut. Gunakan nilai ini untuk memverifikasi bahwa operasi berjalan sesuai harapan.
AffectedRows dikembalikan dalam header respons HTTP x-log-affectedrows. Di Python SDK, baca melalui resp.affected_rows.
Prasyarat
Sebelum memulai, pastikan Anda memenuhi persyaratan berikut:
Proyek Simple Log Service. Untuk informasi lebih lanjut, lihat Create a project.
Logstore dengan parameter
enableModifydiatur ketrue. Lihat Aktifkan fitur dalam topik ini.Izin RAM
log:UpdateLogStoreLogsdanlog:DeleteLogStoreLogsdiberikan kepada pemanggil. Lihat Izin RAM yang diperlukan dalam topik ini.(Bersyarat) Jika Anda menggunakan operasi berbasis kueri, bidang yang dirujuk dalam kueri harus memiliki indeks yang dikonfigurasi.
Aktifkan fitur
Untuk menggunakan pembaruan dan penghapusan tingkat baris, atur parameter enableModify ke true saat memanggil API CreateLogStore.
Anda hanya dapat mengatur
enableModifysaat membuat Logstore baru. Anda tidak dapat mengaktifkan fitur ini untuk Logstore yang sudah ada.Setelah Anda mengatur
enableModifyketrue, Anda tidak dapat menonaktifkannya.Fitur ini hanya dapat diaktifkan melalui OpenAPI atau SDK. Konsol Simple Log Service tidak mendukung fitur ini.
Aktifkan melalui OpenAPI
Panggil API CreateLogStore dan atur enableModify ke true dalam badan permintaan:
POST /logstores HTTP/1.1
Host: <project>.<endpoint>
Content-Type: application/json
{
"logstoreName": "my-logstore",
"ttl": 30,
"shardCount": 1,
"enableModify": true
}
Setelah membuat Logstore, panggil API GetLogStore untuk memverifikasi. Jika badan respons berisi "enableModify": true, berarti fitur telah diaktifkan.
Aktifkan melalui Python SDK
from aliyun.log import LogClient
# Dapatkan kredensial AccessKey dari variabel lingkungan.
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,
)
Memodifikasi dan menghapus data
Simple Log Service mendukung dua metode untuk memodifikasi dan menghapus data log:
Metode |
Skenario |
Jumlah maksimum baris per permintaan |
Berdasarkan RowID |
Anda mengetahui RowID pasti dari catatan target dan ingin memodifikasi atau menghapusnya secara tepat. |
1 |
Berdasarkan kueri |
Anda ingin memodifikasi atau menghapus semua catatan yang sesuai dengan kondisi kueri secara batch. |
10.000 |
Metode 1: Memodifikasi dan menghapus berdasarkan RowID
Gunakan metode ini ketika Anda sudah memiliki RowID dari catatan tertentu, biasanya diperoleh dari hasil kueri sebelumnya.
Memodifikasi satu catatan
Tentukan hanya bidang yang ingin diubah. Bidang yang tidak disertakan tetap tidak berubah.
from aliyun.log import LogClient, LogItem
client = LogClient(endpoint, access_key_id, access_key)
# Tentukan hanya bidang yang akan diperbarui. Bidang yang tidak disebutkan mempertahankan nilai aslinya.
new_item = LogItem(
contents=[("status", "REFUNDED")],
)
resp = client.update_logs(
project="my-project",
logstore="my-logstore",
rowid=rowid,
log_item=new_item,
)
print(f"Baris yang terpengaruh: {resp.affected_rows}")
Menghapus satu catatan
resp = client.delete_logs_v2(
project="my-project",
logstore="my-logstore",
rowid=rowid,
)
print(f"Baris yang terpengaruh: {resp.affected_rows}")
Menghapus catatan yang sama beberapa kali bersifat idempoten. Operasi tidak mengembalikan error, tetapi
affected_rowsmengembalikan0.Gunakan
delete_logs_v2untuk penghapusan sinkron. Metode lamadelete_logsmelakukan soft delete asinkron, yang tidak didukung untuk Logstore denganenableModifydiaktifkan.
Metode 2: Memodifikasi dan menghapus berdasarkan kueri
Gunakan metode ini untuk memodifikasi atau menghapus catatan secara batch yang sesuai dengan kondisi kueri. Simple Log Service menjalankan kueri di sisi server dan menerapkan modifikasi atau penghapusan ke semua catatan yang sesuai.
Operasi ini tidak dapat dikembalikan.
Jika operasi gagal sebagian, baris yang sudah dimodifikasi atau dihapus tidak dikembalikan. Respons hanya mengembalikan jumlah baris yang benar-benar terpengaruh.
Sebelum mengeksekusi, gunakan Search atau SQL untuk melihat pratinjau catatan yang sesuai dengan kondisi kueri Anda dan verifikasi cakupannya.
Operasi batch berbasis kueri membutuhkan banyak sumber daya. Persempit rentang waktu atau perhalus kondisi kueri agar tetap dalam batas 10.000 baris per permintaan.
Bidang yang dirujuk dalam kueri harus memiliki indeks yang dikonfigurasi. Jika tidak, kueri tidak mengembalikan hasil apa pun.
Hapus berdasarkan kueri
resp = client.delete_logs_v2(
project="my-project",
logstore="my-logstore",
from_time=1716537600,
to_time=1716624000,
query='level: DEBUG',
)
print(f"Baris yang dihapus: {resp.affected_rows}")
Modifikasi berdasarkan kueri
Tentukan baik kondisi kueri maupun nilai bidang yang akan diperbarui. Semua catatan yang sesuai diperbarui dengan nilai bidang yang sama.
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"Baris yang dimodifikasi: {resp.affected_rows}")
Jika Anda memberikan parameter
rowiddanquerydalam permintaan yang sama,rowidmemiliki prioritas lebih tinggi dan parameterquerydiabaikan.Operasi berbasis kueri memerlukan data agar dapat dilihat melalui kueri. Mungkin terjadi penundaan beberapa detik antara ingesti data dan ketersediaan data untuk kueri.
Verifikasi hasil
Setelah menjalankan operasi modifikasi atau penghapusan, verifikasi hasilnya untuk memastikan operasi berhasil sesuai harapan.
-
Periksa AffectedRows: Setiap permintaan mengembalikan
AffectedRowsdalam respons (header HTTPx-log-affectedrowsatauresp.affected_rowsdi Python SDK). Bandingkan nilai ini dengan jumlah catatan yang diharapkan:AffectedRows > 0dan sesuai ekspektasi: Operasi berhasil.AffectedRows = 0: Tidak ada catatan yang sesuai dengan kondisi, atau catatan sudah dihapus. Periksa ulang kueri atau RowID Anda.AffectedRowslebih rendah dari yang diharapkan: Kemungkinan terjadi kegagalan sebagian. Jalankan ulang operasi untuk catatan yang tersisa.
-
Jalankan kueri lanjutan: Untuk operasi batch, jalankan kueri Search atau SQL setelah operasi untuk memastikan data mencerminkan status yang diharapkan. Hal ini terutama penting ketika
AffectedRowslebih rendah dari yang diharapkan.
Konsistensi data
Operasi modifikasi dan penghapusan berlaku secara sinkron. Setelah permintaan berhasil, kueri berikutnya (Search, SQL, dan SPL) mengembalikan hasil yang diperbarui.
Perhatikan perilaku berikut:
-
Konsumsi real-time tidak terpengaruh: Konsumen LogHub dan tugas pengiriman (seperti pengiriman ke OSS atau MaxCompute) beroperasi pada aliran tulis asli. Modifikasi atau penghapusan tidak tercermin. Hanya jalur pembacaan berbasis kueri yang mengembalikan data terbaru.
-
Operasi berbasis kueri tidak atomik: Server memproses setiap catatan yang sesuai secara individual. Jika terjadi kegagalan sebagian, catatan yang sudah diproses tidak dikembalikan. Respons mengembalikan jumlah baris yang benar-benar terpengaruh.
Izin RAM yang diperlukan
Pengguna atau role Resource Access Management (RAM) yang memanggil API modifikasi atau penghapusan harus memiliki izin berikut:
Action |
Deskripsi |
|
Memodifikasi data log berdasarkan RowID atau kueri. |
|
Menghapus data log berdasarkan RowID atau kueri. |
Format ARN resource:
acs:log:<region>:<account-id>:project/<project-name>/logstore/<logstore-name>
Kami menyarankan Anda membuat pengguna atau role RAM khusus untuk operasi modifikasi dan penghapusan, terutama untuk penghapusan batch berbasis kueri. Gunakan ActionTrail untuk mengaudit operasi ini.
Batasan penggunaan
Item |
Deskripsi |
Hanya untuk Logstore baru |
Anda harus mengatur |
Tidak dapat dinonaktifkan |
Setelah mengaktifkan fitur ini, Anda tidak dapat menonaktifkannya. |
Jumlah maksimum baris per operasi berbasis kueri |
10.000 baris per permintaan. Jika kueri menemukan lebih dari 10.000 catatan, permintaan ditolak. Persempit rentang waktu atau perhalus kondisi kueri. |
Persyaratan indeks |
Bidang yang digunakan sebagai kondisi kueri harus memiliki indeks yang dikonfigurasi. Operasi berdasarkan RowID tidak memerlukan indeks bidang bisnis. |
Tidak ada rebuild indeks |
Setelah mengaktifkan fitur ini, Logstore tidak mendukung rebuild indeks. |
Tidak ada soft delete |
Setelah mengaktifkan fitur ini, soft delete asinkron tidak didukung. Gunakan antarmuka penghapusan sinkron ( |
|
Anda tidak dapat menggunakan |
Konsumen real-time tidak diberi notifikasi |
Konsumen LogHub dan tugas pengiriman (seperti pengiriman ke OSS atau MaxCompute) tidak diberi notifikasi tentang modifikasi atau penghapusan. Hanya jalur pembacaan berbasis kueri (Search, SQL, SPL) yang mengembalikan data terbaru. |
Penagihan
Operasi modifikasi: Setiap operasi modifikasi menghasilkan biaya tambahan untuk penyimpanan indeks dan trafik indeks atas data yang diperbarui.
Operasi penghapusan: Operasi penghapusan tidak menimbulkan biaya tambahan.
FAQ
Dapatkah saya mengaktifkan fitur ini untuk Logstore yang sudah ada?
Tidak. Fitur ini bergantung pada format penyimpanan dasar yang hanya tersedia saat pembuatan Logstore. Untuk menggunakan fitur ini, buat Logstore baru dengan enableModify=true, lalu migrasikan data historis ke Logstore baru melalui transformasi data atau SDK.
Apakah operasi modifikasi dan penghapusan memengaruhi konsumen real-time?
Tidak. Konsumen LogHub dan tugas pengiriman (seperti pengiriman ke OSS atau MaxCompute) beroperasi pada aliran tulis asli dan tidak mencerminkan modifikasi atau penghapusan. Hanya jalur pembacaan berbasis kueri (Search, SQL, dan SPL) yang mengembalikan data terbaru.
Apakah modifikasi dan penghapusan langsung terlihat?
Ya. Setelah permintaan berhasil, kueri baru mengembalikan data yang diperbarui. Nilai AffectedRows dalam respons menunjukkan jumlah catatan yang benar-benar dimodifikasi atau dihapus.
Dapatkah saya mengembalikan modifikasi atau penghapusan yang tidak disengaja?
Tidak. Tidak ada mekanisme rollback bawaan. Sebelum menjalankan operasi modifikasi atau penghapusan, gunakan Search atau SQL untuk melihat pratinjau catatan yang sesuai dengan kondisi kueri Anda. Kami menyarankan Anda menggunakan pengguna RAM khusus dengan izin terbatas untuk operasi ini dan mengaktifkan ActionTrail untuk auditing.
Apakah penghapusan langsung membebaskan ruang penyimpanan?
Penghapusan adalah operasi logis. Penyimpanan dasar tetap dipertahankan hingga TTL (time to live) Logstore berakhir atau tugas kompaksi latar belakang dijalankan. Namun, semua jalur kueri menyaring catatan yang dihapus, sehingga data yang dihapus tidak terlihat oleh pengguna.