Lesson 72 — Structured Logging
Ba module tương tác: (1) cùng một sự kiện ở dạng Text vs JSON và vì sao JSON query được, (2) một request đi xuyên 3 service — lọc theo request_id, (3) log level filter — kéo slider để thấy cái gì bị lọc. Mở README (nút 📖 góc phải) để đọc lý thuyết đầy đủ.
Module 1 — Text vs JSON: cùng sự kiện, hai format
Một sự kiện user login với các field. Đổi giá trị rồi xem nó hiện ra ở hai format. Cùng một code slog.Info(...), chỉ khác handler.
TextHandler dev — đọc bằng mắt
JSONHandler prod — máy query
Vì sao JSON query được? Mỗi field là một "cột" có tên. Ví dụ các truy vấn chỉ làm được với JSON:
Module 2 — Correlation ID: 1 request xuyên 3 service
Bấm "Gửi 1 request" để sinh log ở cả 3 service (mỗi request một request_id riêng). Rồi nhập một request_id để lọc — thấy đúng chuỗi log của nó xuyên cả 3 service, đúng như khi điều tra sự cố.
gateway (edge)
orders
payment
Cách hoạt động:
gateway sinh request_id ở edge, rồi propagate qua header X-Request-ID xuống orders → payment. Cùng một ID xuyên cả 3 → filter ra cả chuỗi. Nếu một service quên propagate header, chuỗi sẽ đứt ở đó.
Module 3 — Log level filter
Handler chỉ in log có level ≥ level cấu hình. Kéo slider để đặt ngưỡng và xem dòng nào bị lọc — đây chính là cách bật/tắt Debug ở prod mà không sửa code.
INFO
DEBUG
INFO
WARN
ERROR
Đặt ngưỡng INFO ở prod: Debug bị lọc (giảm noise + chi phí). Khi điều tra, hạ xuống DEBUG (runtime, qua
slog.LevelVar) để thấy chi tiết — rồi nâng lại. Lưu ý đừng để mọi thứ ở Info: Debug ồn ào phải nằm ở Debug.