Một lập trình viên khi bắt đầu học về Java sẽ sử dụng câu lệnh System.out.println() hoặc System.err.println() để xuất bất kì thông tin nào mình muốn. Đây là điều cực kì phổ biến và dành cho người lập trình Java căn bản.
Trong quá trình phát triển, thử nghiệm và gỡ lỗi chương trình Java thì in thông báo tới console (bảng điều khiển) là một phần không thể thiếu. Nếu bạn đang làm việc trên ứng dụng phía Server (máy chủ), nơi bạn không thể thấy những gì đang diễn ra bên trong, công cụ hiển thị duy nhất của bạn là file log (tệp nhật ký); nếu không có log, bạn không thể thực hiện bất kỳ gỡ lỗi nào hoặc xem những gì đang xảy ra bên trong ứng dụng của mình. Mặc dù vậy, Java có các phương thức System.out.println () khá tiện dụng để in nội dung nào đó trên console, cũng có thể được định tuyến đến log nhưng không đủ cho một ứng dụng Java trong thực tế. Nếu bạn đang chạy một chương trình Java trong Linux hoặc bất kỳ hệ thống dựa trên UNIX nào, Log4j hoặc SLF4j hoặc bất kỳ logging nào khác cung cấp nhiều tính năng hơn, tính linh hoạt và cải thiện chất lượng thông báo trả về, điều mà System.out.println () không làm được.
Nếu bạn đang sử dụng IDE như Eclipse hoặc Netbeans, bạn có thể nhận được cảnh báo khi sử dụng System.out.println() cho mục đích ghi log, điều này tốt, nếu không, bạn có thể gặp phải tình huống có một số thông báo vào file log trong khi nó phải đi đến một nơi khác, có thể là trên tệp mà console được chuyển hướng.
Ghi log là một phương pháp hay nhất để sử dụng công cụ Logging trong khi viết code bằng Java, ngay cả những cuốn sách như Clean Code cũng khuyên bạn nên học Log4j để ghi log.
Vậy tại sao Log4j lại được khuyến khích sử dụng hơn System.out.println()?
Nhiều lập trình viên Java có lý do riêng khi sử dụng Logging Framework như Log4j, java.util.Logger, SL4j hoặc thậm chí là dùng Apache Commons, nhưng tất cả đều tốt hơn so với việc sử dụng System.out.println(). Mặc dù lời khuyên của tôi là thích SLF4j hơn Log4j để đăng nhập Java như đã thảo luận trong bài viết. Dù sao, đây là một số lý do mà tôi nghĩ là đủ để ngăn bạn sử dụng câu lệnh System.out.println():
- Bất kỳ Logging Framework nào bao gồm log4j, sl4j, logback và java.util.logger cho phép bạn debug thông tin bằng một log level (cấp độ ghi log), sau này bạn có thể sử dụng level đó làm tiêu chí lọc, tức là bạn có thể vô hiệu hóa message thuộc về một log level cụ thể, ví dụ: bạn sẽ quan tâm nhiều vào việc xem thông báo WARN hơn là DEBUG.
- Liên quan đến phần trước đó là Logging Framework cho phép bạn ngăn chặn các message từ logging level khác, ví dụ: bạn có thể chạy ứng dụng của mình ở chế độ DEBUG trong môi trường test, nhưng ở chế độ WARN trong môi trường production. Điều này sẽ không chỉ tạo ra ít log hơn mà còn cải thiện hiệu suất của ứng dụng của bạn vì ít ghi log hơn. Điều này không thể xảy ra với các câu lệnh System.out.println () không thể được điều khiển bởi bất kỳ cấu hình nào hoặc trong thời gian chạy bằng JMX. Mặt khác, bạn có thể thay đổi level log cho trình ghi log dựa trên log4j mà không cần khởi động lại ứng dụng của mình bằng cách sử dụng luồng giám sát, theo dõi vị trí cho log4j.xml được cập nhật, tệp cấu hình cho Apache Log4j. Java.util.Logger cũng cho phép bạn thay đổi cấp độ ghi log bằng JMX mà không cần khởi động lại server.
- Bằng cách sử dụng Logging Framework, bạn có thể tạo ra kết quả đầu ra và siêu dữ liệu tốt hơn, điều này sẽ giúp ích trong quá trình khắc phục sự cố và gỡ lỗi. Hầu hết các Logging Framework, ví dụ: Log4j cho phép bạn in đầu ra có một mẫu định dạng bằng cách sử dụng PatterLayout, có thể bao gồm một timestamp, tên của class, thread đang thực thi mã, v.v. Tất cả thông tin này có thể thực sự hữu ích trong khi gỡ lỗi các ứng dụng đồng thời giúp đầu ra từ nhiều thread bị chồng chéo. Đây là những điều thuận tiện khi ghi log mà System.out.println () không thể làm được. Trước đó Joshua Bloch cũng đã đề xuất sử dụng một phương tiện ghi log thích hợp, ví dụ: java.util.Logger cho logging, cuốn sách kinh điển của ông Effective Java - một trong những cuốn sách phải đọc đối với các lập trình viên Java có kinh nghiệm.
Việc sử dụng System.out hoặc System.err thay vì một phương tiện ghi log chuyên dụng sẽ gây khó khăn cho việc giám sát hoạt động của chương trình.
Ví dụ 1: Bất kì một lập trình viên nào cũng sẽ đọc hoặc viết một chương trình Java đầu tiên giống như sau:
public class MyClass
public static void main(String[] args) {
System.out.println("hello world");
}
}
Phải mất một khoảng thời gian tìm hiểu các công nghệ hiện đại và thực hành nhiều thì các lập trình viên mới từ bỏ việc viết thông báo cho đầu ra chuẩn bằng câu lệnh System.out.println (). Chà, điều này là ổn nếu bạn đang viết các chương trình test nhỏ nhưng chắc chắn là không đúng nếu bạn viết code trên một hệ thống có hàng chục nghìn người dùng hoặc giao dịch. Việc ghi log cũng ảnh hưởng lớn đến hiệu suất. Hình dưới mô tả quy trình ghi log tong một ứng dụng Java.
System.out.println là một hoạt động IO và do đó tốn thời gian. Vấn đề khi sử dụng nó trong mã của bạn là chương trình của bạn sẽ đợi cho đến khi println kết thúc. Đây có thể không phải là vấn đề với các trang web nhỏ nhưng ngay sau khi tải hoặc nhiều lần lặp lại, bạn sẽ cảm thấy khó chịu. Cách tiếp cận tốt hơn là sử dụng Logging Framework.
Điều nhấn mạnh cuối cùng, hoàn toàn ổn nếu bạn đang viết các chương trình test và ứng dụng nhỏ nhưng nó không ổn trong ứng dụng Java trong thực tế. Với những lý do trên tại sao chúng ta không sử dụng Logging Framework?
Bình luận