All Products
Search
Document Center

Simple Log Service:Memodifikasi dan menghapus data log

Last Updated:Jun 26, 2026

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.

Penting

Perhatikan hal-hal berikut sebelum menggunakan fitur ini:

  • Fitur ini hanya tersedia untuk Logstore yang baru dibuat. Atur enableModify ke true saat 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.

Catatan

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 enableModify diatur ke true. Lihat Aktifkan fitur dalam topik ini.

  • Izin RAM log:UpdateLogStoreLogs dan log:DeleteLogStoreLogs diberikan 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.

Peringatan
  • Anda hanya dapat mengatur enableModify saat membuat Logstore baru. Anda tidak dapat mengaktifkan fitur ini untuk Logstore yang sudah ada.

  • Setelah Anda mengatur enableModify ke true, 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}")
Catatan
  • Menghapus catatan yang sama beberapa kali bersifat idempoten. Operasi tidak mengembalikan error, tetapi affected_rows mengembalikan 0.

  • Gunakan delete_logs_v2 untuk penghapusan sinkron. Metode lama delete_logs melakukan soft delete asinkron, yang tidak didukung untuk Logstore dengan enableModify diaktifkan.

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.

Penting

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.

Catatan

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}")
Catatan
  • Jika Anda memberikan parameter rowid dan query dalam permintaan yang sama, rowid memiliki prioritas lebih tinggi dan parameter query diabaikan.

  • 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 AffectedRows dalam respons (header HTTP x-log-affectedrows atau resp.affected_rows di Python SDK). Bandingkan nilai ini dengan jumlah catatan yang diharapkan:

    • AffectedRows > 0 dan sesuai ekspektasi: Operasi berhasil.

    • AffectedRows = 0: Tidak ada catatan yang sesuai dengan kondisi, atau catatan sudah dihapus. Periksa ulang kueri atau RowID Anda.

    • AffectedRows lebih 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 AffectedRows lebih 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

log:UpdateLogStoreLogs

Memodifikasi data log berdasarkan RowID atau kueri.

log:DeleteLogStoreLogs

Menghapus data log berdasarkan RowID atau kueri.

Format ARN resource:

acs:log:<region>:<account-id>:project/<project-name>/logstore/<logstore-name>
Catatan

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 enableModify=true saat membuat Logstore. Anda tidak dapat mengaktifkan fitur ini untuk Logstore yang sudah ada.

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 (delete_logs_v2) yang dijelaskan dalam topik ini.

__rowid__ dicadangkan

Anda tidak dapat menggunakan __rowid__ sebagai nama bidang indeks atau nama bidang kustom.

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.