Hôm nay mình sẽ giới thiệu tầm quan trọng của việc ghi log trong phát triển ứng dụng/phần mềm.

Bạn đang xem: Logging là gì

I. Ghi Log là gì?II. Tại sao phải ghi Log?III. Ghi log như thế nào cho đúng?1. Phải lưu log những gì ?1.1. Các tiến trình chạy ngầm1.2. Các khối Try Catch Exception1.3. Các nghiệp vụ phức tạp1.4. Khi giao tiếp với hệ thống khác: (Gọi vào và gọi ra).1.5. Các chức năng về tác động vào cơ sở dữ liệu: (select, insert, update, delete..)1.6. Các loại khác2. Lưu log ở đâu ?2.1. Lưu log vào file trong hệ thống2.2. Lưu log vào cơ sở dữ liệu3. Lưu log bằng cách gì ?

I. Ghi Log là gì?

Hiểu đại lọai ghi log là một hành động lưu lại dấu vết, các thông tin được thông báo trong quá trình xử lý của một đoạn code, một chức năng hay một ứng dụng.

Hiện nay mọi ứng dụng, hệ thống lớn nhỏ đều có thực hiện ghi log. Ví dụ đơn giản như sử dụng điện thoại android, khi vào 1 ứng dụng bị lỗi, lập tức sẽ bị văng ra kèm theo 1 thông báo để người dùng có thể “report” cho nhà phát triển ứng dụng.

*

Hay đơn cử như cả team bạn đang giao tranh trong game LoL (Liên Minh Huyền Thoại) và bạn cầm Ad (Attack Damage), đang bắn team bạn ầm ầm. Bỗng bùm, game tự động tắt. Bạn chửi thề bla..bla..bla . Máy tính hiện lên thông báo. Sau đó bạn bấm “Send Error Report” gửi log lỗi lên cho nhà phát triển để họ xem và họ sửa lỗi.

*

II. Tại sao phải ghi Log?

Như bình thường, trong quá trình xây dựng phần mềm, khi phát triển các bạn sẽ bật chức năng debug của IDE, xem lỗi ở đâu rồi fix.

Nhưng khi quá trình phát triển hoàn thành và  deploy lên server, chẳng có lập trình viên nào cam đoan rằng chương trình/phần mềm của mình không xảy ra lỗi cả. Có thể deloy lên product xong phần mềm chạy rất mượt mà, vận hành trơn tru.

Rồi bỗng một ngày đẹp trời, khách hàng gọi và báo rằng xảy ra một lỗi gì đó trong chức năng. Thế là bạn bắt đầu hỏi về lỗi ấy như thế nào, bạn chạy lại project, test hết case này sang case nọ cũng đều chung một kết quả “méo có lỗi gì hết”. Thế là bạn lại đặt ra câu hỏi: Nghĩa là sao ???. Bạn báo lại khách hàng là theo dõi thêm. Không lâu sau, khách hàng lại phàn nàn về lỗi … Thế là cái vòng tròn cứ thế mà bạn có thể chẳng check ra bất kỳ một lỗi nào cả.

Xem thêm: Vi – Exploration Craft 145

Viết đến đây chắc các bạn cũng hơi mường tượng ra tầm quan trong của lưu log rồi phải không?

Thế bạn tự hỏi : Lưu log những gì, lưu ở đâu, lưu bằng gì… mời bạn tiếp tục theo dõi phần 3 nhé.

III. Ghi log như thế nào cho đúng?

1. Phải lưu log những gì ?

Có một số bạn quan niệm rằng, cứ lưu log càng nhiều càng tốt. Cứ sau vài đoạn code lại lưu log 1 cái. Đây là một quan niệm hoàn toàn sai lầm mà các bạn nên tránh, cứ cái gì càng nhiều không phải là càng tốt (trừ một số thứ như tiền, vợ :), bla, bla …).

Ghi log nhiều sẽ làm chúng ta khó kiểm soát, khó trace log khi cần mà lại còn tốn dung lượng lưu trữ nữa. Còn lưu ít quá đôi khi cái lỗi mà chúng ta không ngờ tới (rồi bỏ qua không lưu log) đến khi trace lại để xem lại không có. À ! Vậy thì phải lưu đủ, không thừa, không thiếu. ????

Khái niệm đủ theo như kinh nghiệm và sưu tầm của mình thì chúng ta nên lưu log ở một số vị trí sau:

1.1. Các tiến trình chạy ngầm Lưu log lúc start và finish + thời gian xử lý xem có chuẩn với thời gian mà chúng ta đặt lịch không, tốc độ xử lý nhanh hay chậm. Lưu log lúc xử lý: Nếu tiến trình xử lý đơn giản có thể lưu log trước và sau khi xử lý. Nếu tiến trình phức tạp, chúng ta nên break ra các bước để lưu log để giám sát việc tiến trình đang xử lý đến bước nào, gặp lỗi ở bước nào.. Với các tiến trình xử lý nhiều, có khả năng gây tải cao hệ thống, cần lưu log theo dõi thông tin server hiện tại RAM, CPU.. để tối ưu hóa hệ thống cũng như chọn server phù hợp. 1.2. Các khối Try Catch Exception

*

1.3. Các nghiệp vụ phức tạp Cũng cần break từng bước để lưu log, theo dõi quá trình và trace log sau này. 1.4. Khi giao tiếp với hệ thống khác: (Gọi vào và gọi ra). Cần lưu log các đoạn thực hiện gọi api/service: các thông tin api ( link, method, resquest, respond.. ), thời gian xử lý, người request, Error stack trace về error đó như lỗi ở đoạn nào, dòng nào, lỗi gì, input như thế nào,… Khi xem lại đoạn log, chúng ta biết được cách tái hiện lại lỗi hay phán đoán lỗi xảy ra như thế nào để khắc phục nhanh hơn và chính xác hơn. 1.5. Các chức năng về tác động vào cơ sở dữ liệu: (select, insert, update, delete..) Lưu log trước và sau khi tác động, người tác động.. để kiểm soát dữ liệu và trace log người tác động và cũng có thể rollback khi cần. 1.6. Các loại khác Lưu log khi chương trình xảy ra lỗi, chúng ta không thực hiện được việc tái hiện lỗi để fix bug. Cần đặt log ở vị trí nghi ngờ để theo dõi và có thể trace log tìm ra case gây lỗi sau này.

2. Lưu log ở đâu ?

2.1. Lưu log vào file trong hệ thống

Đây là nơi rất nhiều lập trình viên đã và đang làm. Tuy nhiên cũng có những tiêu chuẩn nhất định trong việc lưu log ở file:

Để file log to quááááááááá (hiệu ứng echo do file to quá J), mở xem như nào đây? File log lưu cả tháng, sau đó bạn phải trace một đoạn log của 1 ngày giữa tháng … => Nên chia ra từng ngày sẽ hợp lý hơn. … 2.2. Lưu log vào cơ sở dữ liệu

Cách làm này sẽ giúp tiết kiệm được tài nguyên hệ thống, trace log một cách dễ dàng hơn, rất thuận tiện trong việc giám sát log.

3. Lưu log bằng cách gì ?

Một số lập trình viên lúc mới “bước vào nghề” thường có thói quen print ra màn hình những gì mình muốn, có thể là respond của 1 Api, exception message của 1 khối catch… => ĐÓ CŨNG LÀ 1 CÁCH LƯU LOG.

Tuy nhiên nếu bạn đã và đang làm như thế thì ngay bây giờ bạn có thể tập bỏ thói quen đó ngay. Bởi:

Cơ chế print ra màn hình là cơ chế thao tác tuần tự, dẫn đến chương trình, module tốn rất nhiều thời gian để xử lý => chậm. Khó trace log sau này. Trường hợp khách hàng muốn theo dõi, giám sát hệ thống log để nếu có lỗi thì báo ngay cho bộ phận kỹ thuật xử lý. Trường hợp này nếu lưu log bằng print ra màn hình sẽ rất khó xử lý.

Tùy theo mục đích và yêu cầu giám sát log để có thể chọn nơi lưu log, cách lưu log thích hợp cho dự án của bạn. Tuy nhiên việc lưu log ở đâu, lưu log những gì, lưu log bằng cách nào bạn cũng cần phải tuần thủ theo một số nguyên tắc sau:

Lưu log theo cấu trúc nhất định (tránh lưu raw text). Lưu theo ngày/tuần/tháng/quý Lưu theo loại log (theo thứ tự ưu tiên từ thấp đến cao ALL ). Đảm bảo chương trình vẫn chạy bình thường khi quá trình ghi log xảy ra lỗi. Thời gian xử lý của việc ghi log phải đảm bảo không gây ảnh hưởng quá nhiều đến thời gian xử lý nghiệp vụ. Hoặc 1 số chiến lược khác tùy vào yêu cầu ứng dụng.

Thật may là hiện nay, hầu hết các framewok hiện nay đều được cung cấp chức năng ghi log tự động, tuy nhiên bên cạnh việc đọc hiểu bug thì đọc log cũng là một kỹ năng rất quan trọng. Ví dụ: log4j, logback, slf4j..

Thư viện ghi log bất đồng bộ trong java mình thường dùng là log4j. Nhìn qua ban đầu thì câu lệnh ghi log trên log4j cũng chỉ đơn giản là logger.debug(“debug log message”) hay logger.info(“info log message”) . Tuy nhiên đằng sau nó là cả một hệ thống xử lý. Nội dung ghi log sẽ cho vào 1 hàng đợi, tiến trình trên log4j sẽ quét hàng đợi để xử lý từng lệnh, giảm thiểu tối đa việc ảnh hưởng đến thời gian xử lý của nghiệp vụ.

Xem thêm: Tải Game Valorant – Cách Tải Và Cài đặt Valorant Trên Pc

Qua bài này, mình đã giới thiệu khái quát cho các bạn về tầm quan trọng của ghi log trong phát triển phần mềm, cách lưu log ở đâu, lưu log như thế nào. Ngoài ra, các bạn cũng đã biết 1 framework tiêu chuẩn cơ bản trong lưu log hiện nay là logj4. Ở bài sau, mình sẽ có ví dụ cụ thể trình bày các bước để tích hợp logj4 vào ứng dụng.

 

Chuyên mục: Hỏi Đáp