Skip to content

Logging Pengiriman (Delivery Log)

Log pengiriman email disimpan di Elasticsearch, bukan di tabel database. Ada dua index utama dan beberapa jalur ingest.

Arsitektur

Dua index Elasticsearch

IndexEnv varIsi
raw-logES_RAW_LOG_INDEX (dashboard-raw-log)Baris log mentah postfix/ZoneMTA (cleanup, smtp, qmgr). Dipakai untuk laporan admin, ekspor CSV, daily-failed report.
clean-logES_CLEAN_LOG_INDEX (dashboard-clean-log)1 dokumen per penerima per pesan: {id, queueid, messageid, subject, sender, domain, recipient, recipient_domain, status, datetime, shost, chost, chost_ip, chost_port, msg}. Dipakai untuk UI delivery log pelanggan.

Jalur ingest

Jalur A — Logstash + callback removed-flag (utama untuk ZoneMTA/postfix)

  1. Logstash mengirim baris mentah ke ES dashboard-raw-log dan POST ke /api/v1/callback-raw-log.
  2. Controller: controllers/callbackRawLog.js.
  3. Saat body berisi status2: "removed", strategi useRemovedFlag berjalan:
    • Query semua dokumen raw-log dengan queueid sama.
    • Parse via StrategyRowRemoved.main() atau .zmtaLog() (bila ada field log_level).
    • Hasilkan 1 baris clean per penerima.
  4. Tiap baris clean di-index ke ES_CLEAN_LOG_INDEX via es.add().
  5. Efek samping: tracking kuota, update counter pemakaian, suspend relay (tutup akun Zimbra) bila kuota 100%.

Jalur B — Webhook SparkPost (langsung ke clean-log)

  • Route: POST /callback/sparkpostcallbacks/sparkpostCallback/sparkpostCallback.js.
  • Basic Auth: SPARKPOST_WEBHOOK_USER / SPARKPOST_WEBHOOK_PASS.
  • Memetakan message_event SparkPost → skema internal via sparkpostService.js.
  • Menulis langsung ke clean-log (melewati raw-log).
  • Enforcement kuota/usage sama seperti Jalur A.

Jalur C — Trigger manual/batch (alat admin)

  • controllers/reports/logTriggerRaw/logTriggerRawController.js.
  • Menerima teks postfix mentah, parse dengan regex, tulis langsung ke clean-log.

Strategi alternatif (sebagian besar tidak terpakai)

  • controllers/callbackRawLogUpsert.js — upsert incremental per baris log.
  • controllers/callbackRawLogFilebased.js — pendekatan file-buffer.
  • Orkestrasi strategi: helpers/elasticsearches/strategy/strategy-main.helper.js (useRemovedFlag, useUpsert, useFileBased).

Helper Elasticsearch

PathPeran
helpers/es.helper.jsClient inti ES: add, find, search, getHits, updateById
helpers/elasticsearches/cleanLogs/esCleanLog.helper.jsKlasifikasi baris log mentah + lookup
helpers/elasticsearches/cleanLogs/esCleanLogRows.helper.jsEkspansi multi-penerima, build doc ID (queueid-recipient)
helpers/elasticsearches/cleanLogs/esZmtaLog.helper.jsParser format log native ZoneMTA
helpers/elasticsearches/query/esCommonQuery.helper.jsPembangun query ES untuk laporan

Membaca delivery log (dashboard pelanggan)

  • controllers/reports/logDeliveryEmail/logDeliveryEmailController.js.
  • Query ES_CLEAN_LOG_INDEX difilter per domain company, paginasi, default 31 hari terakhir.

Endpoint reporting lengkap ada di Endpoint Billing & Domain / Reports.

Tabel TransEmailLogs

Tabel TransEmailLogs di database tidak dipakai sebagai penyimpanan log. Semua delivery log ada di Elasticsearch. Saat migrasi, putuskan apakah tabel ini di-deprecate atau dijadikan kembali sebagai sumber kebenaran.