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 orderspayment. 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.