# Audit log {#audit-log}

::: info หน้านี้สอนอะไร
เก็บบันทึกว่าใครแก้อะไรเมื่อไร ใครเข้าสู่ระบบ และผู้ดูแลระบบทำอะไรไปบ้าง และวิธีตรวจว่าบันทึกไม่ถูกแก้

**ควรอ่านก่อน:** [ผู้ใช้และการยืนยันตัวตน](./auth)
:::

<Screenshot name="audit" alt="ตั้งค่า → Audit log: ตัวกรอง และรายการพร้อมเวลา เหตุการณ์ เอกสาร และผู้กระทำ" />

เปิดใช้ใน config:

```ts
audit: true, // หรือ { keep: 365, values: true, failedLogins: 20 }
```

การเปิดใช้จะเพิ่มตาราง `audit-logs` จึงต้องสร้าง migration (`npx easy-cms migrate:create audit`) จากนั้นผู้ดูแลระบบจะเห็น
**ตั้งค่า → Audit log** และถ้าเปิด[บทบาทจากหน้า admin](./roles) ก็ให้บทบาทอื่นดูหน้านี้ได้ด้วย

## บันทึกอะไรบ้าง {#what-is-recorded}

- **เนื้อหา:** การสร้าง แก้ไข เผยแพร่ ยกเลิกเผยแพร่ กู้คืน และลบเอกสารกับ global การอัปโหลด และการตั้งเวลา พร้อม
  **field ที่เปลี่ยน** และค่าก่อนกับหลัง เอกสารที่ถูกลบยังเก็บชื่อไว้
- **การเข้าสู่ระบบ:** login, login ไม่สำเร็จ (พร้อมอีเมลที่ลอง), ถูกล็อก, logout, ลืมรหัสผ่าน, ลิงก์รหัสผ่าน และ
  [single sign-on](./sso) (เข้าสู่ระบบ เชื่อม และยกเลิกเชื่อมบัญชี)
- **การจัดการระบบ:** ผู้ใช้ (รวมการเปลี่ยนบทบาทและการปิดใช้งาน), บทบาท, API key, backup ที่เริ่ม ดาวน์โหลด และลบ,
  อีเมลทดสอบ และการส่งซ้ำหรือลบรายการส่ง

แต่ละรายการบอก **ใคร** (อีเมลตอนนั้น ยังอ่านได้แม้ผู้ใช้ถูกลบแล้ว), **ผ่านอะไร** (ผู้ใช้ที่ login, API key ตามชื่อ, โค้ด หรืองาน
ตั้งเวลา), **IP address** และเบราว์เซอร์ ส่วนการอ่านไม่ถูกบันทึก

การเปลี่ยนแปลงจากโค้ดของคุณผ่าน Local API (hook, plugin, สคริปต์ seed) ก็ถูกบันทึกด้วย เป็น **โค้ด (ระบบ)** หรือเป็น
`user` ที่คุณส่งมา

## ค่าที่เก็บ {#values}

- field ที่ซ่อน เช่น password hash ไม่ถูกเก็บเด็ดขาด รหัสผ่านใหม่แสดงแค่ว่า "เปลี่ยนรหัสผ่าน"
- rich text, blocks, array และ JSON แสดงแค่ว่าเปลี่ยน ค่าที่ยาวเกิน 500 ตัวอักษรถูกตัด
- ถ้าข้อมูลอ่อนไหว ใช้ `audit: { values: false }` เพื่อเก็บแค่ชื่อ field ที่เปลี่ยน

## ในหน้า admin {#in-the-admin}

- **ตั้งค่า → Audit log** เรียงรายการใหม่ไปเก่า กรองตามเหตุการณ์ collection ผู้กระทำ และวันที่ได้ กดเปิดรายการเพื่อดูค่า
  ก่อนและหลังของแต่ละ field **ส่งออก CSV** ดาวน์โหลดรายการที่กรองไว้ (สูงสุด 10,000 รายการ)
- หน้าของเอกสารแสดง **กิจกรรม** คือรายการล่าสุดของเอกสารนั้น พร้อมลิงก์ไปดูทั้งหมด
- แดชบอร์ดเตือนเมื่อ **login ไม่สำเร็จหลายครั้ง** ในหนึ่งชั่วโมง (`failedLogins` ค่าเริ่มต้น 20), เมื่อบันทึกบางรายการไม่สำเร็จ
  และเมื่อการตรวจความถูกต้องไม่ผ่าน

## ตรวจการแก้ไข {#tamper-evidence}

รายการแก้หรือลบผ่าน Easy CMS ไม่ได้ ลบได้อย่างเดียวคือรายการที่เก่ากว่า `keep` วัน (ค่าเริ่มต้น 365 ตั้ง `0` เพื่อเก็บไว้
ทั้งหมด) โดยลบจากเก่าสุด แต่ละรายการ**ลงลายเซ็น**ด้วย `EASY_CMS_SECRET` ปุ่ม **ตรวจความถูกต้อง** (และการตรวจรายวันจาก
[งานตั้งเวลา](./drafts#scheduled-publishing)) จะพบรายการที่ถูกแก้ในฐานข้อมูล และรายการที่หายไประหว่างรายการอื่น

สิ่งที่ตรวจไม่พบ: คนที่รู้ secret ของคุณด้วย หรือคนที่ลบรายการล่าสุดท้ายสุด ถ้าต้องการสำเนาที่ไม่มีใครในระบบนี้แก้ได้ ให้ส่ง
เหตุการณ์ออกไปที่อื่นด้วย เช่น ผ่าน [webhooks](./webhooks)

## เขียนรายการจากโค้ด {#writing-entries-from-code}

```ts
await cms.audit.record({ action: 'invoice.sent', target: 'invoices', doc: invoice.id })
```

## ถ้าบันทึกรายการไม่สำเร็จ {#if-an-entry-cant-be-written}

การเปลี่ยนแปลงยังสำเร็จตามปกติ error ถูกเขียนลง log ของ server และแดชบอร์ดบอกว่าหายไปกี่รายการ

## ขั้นต่อไป {#next-steps}

- [บทบาทและสิทธิ์จากหน้า admin](./roles): ใครดู audit log ได้
- [ความปลอดภัย](./security): สิ่งที่ระบบป้องกันให้เพิ่มเติม
