logging-and-monitoring/Writerside/topics/Logging.md

3.5 KiB

Logging

Backend

Đối với backend, Logging nên được setup sử dụng các thư viện như winston dễ dàng xem lại log khi cần

Frontend

Đối với frontend, nếu có thể, nên đưa log về một dịch vụ store log (ví dụ: Parsable). Các dịch vụ này sẽ giúp dễ dàng trace log người dùng đã thực hiện để dễ dàng phát hiện khi có lỗi

Khi nào nên log?

1. Xử lý request và response của client:

Trường hợp này nên log qua middleware và log các request đi vào và response trả về để dễ theo dõi khi có lỗi xảy ra

2. Request và response từ dịch vụ thứ 3 (ví dụ: Paypal):

Các dịch vụ ở bên thứ 3 thường khó kiểm soát. Log request và response ở các trường hợp này sẽ giúp nhanh chóng phát hiện nếu có vấn đề xảy ra Ví dụ:

const payWithPaypal = (payData) => {
    log.debug('Sending payData to paypal service: ', payData);
    const response = paypalService.pay(payData);
    log.debug('Response from paypal service: ', response);
    return response.success;
}

3. Xử lý logic tuần tự

Khi xử lý tuần tự, các bước thực hiện cũng nên được log ra để dễ dàng theo dõi khi có lỗi xảy ra Ví dụ:

const createUser = (user) => {
    log.debug('Validating user');
    validateUser(user);
    log.debug('Saving user avatar');
    saveAvatar(user.avatar);
    log.debug('Saving user to db');
    saveUser(user);
}

4. Xử lý if-else

Các trường hợp chia nhánh lớn để xử lý cũng nên được log để dễ dàng xử lý nếu lỗi xảy ra do luồng chạy đi sai nhánh Ví dụ:

const getSettings = () => {
    const cachedSettings = cache.getSettings();
    if(cachedSettings) {
        log.debug("Settings is found in cache");
        return cachedSettings;
    } 
    log.debug("Settings not found in cache, fetching from db...");
    return db.getSettings();
}

5. Khi có lỗi xảy ra

Khi có lỗi xảy ra, nên log cụ thể nhất có thể lỗi đã xảy ra

6. Log khi có các vấn đề bất thường về phần cứng

Nên log khi CPU hay RAM đang được sử dụng quá nhiều, database mất quá lâu để connect,...

Nên log thế nào?

  • Log đúng level. Các level thường thấy:
    • TRACE: Các log này chỉ nên được dùng ở development để track bug, không nên được commit
    • DEBUG: Các log ở level này là các log thường có khả năng được dùng để debug
    • INFO: Các log ở level này là các thông tin liên quan tới user hay hệ thống (ví dụ: các worker bắt đầu chạy theo lịch trình)
    • NOTICE: Các log ở level này là các thông tin đáng chú ý nhưng không phải lỗi
    • WARN: Các log ở level này là c ác sự kiện có thể trở thành lỗi. Ví dụ: DB đang mất quá lâu để thực hiện một query, một số config được bỏ qua...
    • ERROR: Các lỗi đã xảy ra (API của bên thứ 3 không gọi được, Redis không kết nối được...)
    • FATAL: Các lỗi làm chương trình phải dừng ngay lập tức
  • Log cụ thể nhất có thể và kèm theo các thông tin liên quan tới context
    Ví dụ:
User 54543 successfully registered e-mail user@domain.com
Transaction 2346432 failed: cc number checksum incorrect