Tiêu chí chọn level: ai sẽ đọc dòng này và họ phải làm gì.
ERROR— đã có việc hỏng cần người xử lý (giao dịch thất bại, không ghi được DB). NếuERRORxuất hiện đều đặn mỗi phút mà không ai làm gì, nó đang bị dùng sai level.WARN— bất thường nhưng hệ thống tự phục hồi (retry thành công, rơi về giá trị mặc định). Đáng xem lại sau, không cần đánh thức ai.INFO— mốc nghiệp vụ quan trọng: đơn hàng tạo thành công, job chạy xong. Đây là mức mặc định ở production.DEBUG— chi tiết cho lập trình viên, mặc định tắt ở production, bật tạm khi điều tra.
Tuyệt đối không ghi vào log: mật khẩu, token/API key, số thẻ và CVV, OTP, số CMND/CCCD, cookie phiên, toàn bộ request body của luồng đăng nhập hay thanh toán. Log thường được đẩy sang bên thứ ba, giữ nhiều tháng và cả team đọc được — coi log là vùng dữ liệu công khai nội bộ.
Cách phòng: dùng danh sách trường bị che (redaction) ngay trong logger (password, authorization, card_number → ), log id thay vì nội dung* (user_id thay vì email), và khi log lỗi thì ghi mã lỗi + trường liên quan chứ không dump nguyên object request.