Tampilan
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
| Index | Env var | Isi |
|---|---|---|
| raw-log | ES_RAW_LOG_INDEX (dashboard-raw-log) | Baris log mentah postfix/ZoneMTA (cleanup, smtp, qmgr). Dipakai untuk laporan admin, ekspor CSV, daily-failed report. |
| clean-log | ES_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)
- Logstash mengirim baris mentah ke ES
dashboard-raw-logdan POST ke/api/v1/callback-raw-log. - Controller:
controllers/callbackRawLog.js. - Saat body berisi
status2: "removed", strategiuseRemovedFlagberjalan:- Query semua dokumen raw-log dengan
queueidsama. - Parse via
StrategyRowRemoved.main()atau.zmtaLog()(bila ada fieldlog_level). - Hasilkan 1 baris clean per penerima.
- Query semua dokumen raw-log dengan
- Tiap baris clean di-index ke
ES_CLEAN_LOG_INDEXviaes.add(). - 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/sparkpost→callbacks/sparkpostCallback/sparkpostCallback.js. - Basic Auth:
SPARKPOST_WEBHOOK_USER/SPARKPOST_WEBHOOK_PASS. - Memetakan
message_eventSparkPost → skema internal viasparkpostService.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
| Path | Peran |
|---|---|
helpers/es.helper.js | Client inti ES: add, find, search, getHits, updateById |
helpers/elasticsearches/cleanLogs/esCleanLog.helper.js | Klasifikasi baris log mentah + lookup |
helpers/elasticsearches/cleanLogs/esCleanLogRows.helper.js | Ekspansi multi-penerima, build doc ID (queueid-recipient) |
helpers/elasticsearches/cleanLogs/esZmtaLog.helper.js | Parser format log native ZoneMTA |
helpers/elasticsearches/query/esCommonQuery.helper.js | Pembangun query ES untuk laporan |
Membaca delivery log (dashboard pelanggan)
controllers/reports/logDeliveryEmail/logDeliveryEmailController.js.- Query
ES_CLEAN_LOG_INDEXdifilter 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.