Không dùng là tự sát!

Đúng vậy, #log là một trong những thứ quan trọng nhất của nhất trong lập trình, không có #log chúng ta không thể truy vết được #bug, không có log chúng ta không thể nào biết được điều gì đang diễn ra, nói hoa mỹ 1 chút thì nó giống như việc chúng ta đang đứng trước một màn đêm đen tối vậy. Nếu như chạy trên local thì chúng ta còn có cơ hội sử dụng #breakpoint, nhưng khi đã deploy lên các môi trường alpha, beta, prod, thì chúng ta không còn breakpoint nữa, và chắc hẳn các anh em ở đây đã từng 1 lần điều tra bug và bế tắc trên mọi phương diện, phải dùng phương pháp add thêm log và deploy lại rồi đúng không?

Hỗ trợ debug

Vậy log có gì mà thần thánh vậy? Log cung cấp cho chúng ta rất nhiều thông tin:

  1. Thời gian in ra log
  2. Thread nào đang xử lý
  3. Level của log: DEBUG, INFO, WARN hay ERROR
  4. Lớp nào đang xử lý
  5. Hàm nào đang xử lý
  6. Dòng số bao nhiêu trong file
  7. Nội dung log do chúng ta định nghĩa
  8. Exception đã xảy ra và strackstrace của nó

Đây là những thông tin vô cùng quan trọng giúp chúng ta tìm được nguyên nhân gốc rễ gây ra bug và fix nó.

Gửi log đi đâu?

Chúng ta có thể gửi log đi những đâu? Hiện nay các thư viện log như #log4j12 hay #logback cho phép chúng ta gửi log đi rất nhiều nơi, và chúng ta cũng có thể sử dụng các thư viện khác hoặc tự viết mới các #Appender để gửi log đến bất kì đâu chúng ta muốn, chúng ta có gửi log qua:

  1. Console: Đây nên là một lựa chọn mặc định để chúng ta xem log trên local, hoặc #DevOps sẽ giúp chúng ta in ra file
  2. File: Đây cũng là 1 lựa chọn tốt và chúng ta nên chia log ra mỗi ngày 1 file kiểu này:
    • application.log: để lưu log ngày hiện tại và chúng ta có thể dùng #tailf để theo dõi
    • application-2021-04-21.log để lưu ngày 2021-04-21 và chúng ta có thể dùng #grep để tìm kiếm
  3. Email: Nên dùng cho log ERROR khi có lỗi nghiêm trọng cần xem ngay
  4. Slack: Nên chia các kênh WARN và ERROR riêng để thuận tiện cho đội #DevOps
  5. ELK: #ELK là hệ thống cực kì mạnh chuyên để hộ trợ cho việc xem, truy vấn log, mình sẽ có loạt bài về nó nhé
  6. Loki: Nếu các bạn đang dùng #k8s thì Promtail sẽ đọc file log của chúng ta và đưa vào #loki #DataSource

Nên dùng thế nào?

Log cần thiết như vậy nhưng bao nhiêu log là đủ? Đây là câu hỏi rất đau đầu, gây tranh cãi, nhưng cũng đơn giản thôi, theo kinh nghiệm của mình thì nó tùy thuộc vào giai đoạn của dự án. Giai đoạn đầu, bạn càng log nhiều càng tốt, mỗi dòng code 1 dòng log cũng được, mà hiện nay các thư viện #aspect như #AspectJ hỗ trợ chúng ta can thiệp vào việc bắt đầu gọi hàm và kết thúc gọi hàm chúng ta cũng không cần phải code nhiều. Các #LB (load balancer) như #nginx hay #istio cũng hỗ trợ cho chúng ta log trọn vẹn vòng đời của 1 request, chúng ta hãy sử dụng nó. Nhưng khi dự án đã hoạt động ổn rồi, có thể sau 6 tháng, bạn có thể giảm thiểu log, hoặc giảm level của log để hạn chế log (tiết kiệm ổ cứng) và tăng performace nhé.

Tổng kết

Hãy sử dụng #Log, đây không phải là lời khuyên mà là yêu cầu bắt buộc cho chính chúng ta, những lập trình viên bận rộn với rất nhiều dự án, tính năng và #bug, 1 dòng log có thể giúp chúng ta tiết kiệm rất nhiều ngày debug, nhớ nhé!

Tham khảo:

  1. aspectj
  2. log4j example
  3. logback example
  4. elk-stack
  5. slack-appender