

為什麼需要 Log?
一般系統運作來說,我們都會做系統監控,用來做後續告警維護等機制。監控可分為兩種:
| 類型 | 說明 | 範例 |
|---|---|---|
| 主動式監控 | 系統設計者主動提供可監控的資訊(Log) | 自定義的 access log |
| 被動式監控 | 由外部系統來監控服務運作狀況 | APM 系統、Stack Driver |
兩種方式沒有對錯,選擇取決於現有系統狀態與團隊熟悉的工具。
Log 欄位設計
建議格式
[{DATETIME}] {APP_ENV}.{LEVEL}: {TYPE} {IP} {TIMESTAMP} {METHOD} {REQUEST_URI} {PAYLOAD} {HEADER} {IDENTIFIER}
欄位說明
| 欄位 | 說明 |
|---|---|
| DATETIME | 日期時間 |
| APP_ENV | 環境(staging/production) |
| LEVEL | 等級(INFO/ERROR/WARNING) |
| TYPE | Request 或 Response |
| IP | 來源 IP |
| TIMESTAMP | Unix 時間戳 |
| METHOD | HTTP Method |
| REQUEST_URI | 請求路徑 |
| IDENTIFIER | 使用者識別 |
在 Laravel 中實作
Laravel 的 middleware 設計讓所有 request/response 都會經過,適合在此加入 Log 功能。
常見查詢情境
1. 查看使用者歷程
透過 timestamp 追蹤同一時間的所有請求:
grep 1682394555 middleware_access-2023-04-25.log | awk '{print $1" "$2" "$3" "$6" - "$7" - "$8}'2. 統計 API 使用次數
grep /api/sale-property/search-meta middleware_access-2023-04-25.log | wc -l3. 統計註冊人數
# 總數
grep register *.log | wc -l
# 細項
grep register *.log | awk '{print $1" "$2" "$3" "$6" - "$7" - "$8}'4. 統計錯誤次數
# 總數
grep ERROR middleware_access-2023-04-25.log | wc -l
# 細項
grep ERROR middleware_access-2023-04-25.log | awk '{print $1" "$2" "$3" "$6" - "$7" - "$8" - "$10}'後續優化方向
維運相關
- 災害演練機制
- 告警系統建置
- 文件整理
Log 設計相關
- 確認檔案生成週期(daily 或其他)
- 過期資料處理與備份機制
- 欄位格式優化
Proto 實踐對照
Log 設計在 Proto Django (B2E) 專案中扮演核心角色。Django 的 middleware 機制是掛載 request/response log 的最佳位置——每個請求進出都會經過 middleware,不需要在個別 view 中重複撰寫 log 邏輯。
Proto 的 Log 設計遵循四層原則:request log(記錄進入的請求)、response log(記錄回傳結果)、error log(捕捉例外與錯誤)、query log(追蹤資料庫查詢效能)。這四層搭配起來,能完整還原任何一次 API 呼叫的全貌。
Proto 的 Log 設計不只是記錄,還要能串接到監控系統(Grafana/ELK)。
相關文章: