2010-05-01 28 views
37

Tôi đang sử dụng plugin PMD cho Eclipse và nó mang lại cho tôi một lỗi khi sử dụng System.out.println() với lời giải thích:Logger vs System.out.println

hệ thống (trong | err) .print được sử dụng. , hãy cân nhắc sử dụng bộ ghi nhật ký.

Câu hỏi của tôi là - Trình ghi nhật ký là gì? Làm thế nào nó được sử dụng để in ra màn hình? Tại sao nó tốt hơn?

+0

Cũng thấy câu hỏi gần đây: http://stackoverflow.com/questions/2746578/advantage-of-log4j – BalusC

Trả lời

26

Xem this short introduction to log4j.

Sự cố đang sử dụng System.out để in thông tin gỡ lỗi hoặc chẩn đoán. Đó là một thực hành tồi vì bạn không thể dễ dàng thay đổi cấp độ nhật ký, tắt nó, tùy chỉnh nó, v.v.

Tuy nhiên nếu bạn đang hợp pháp sử dụng System.out để in thông tin cho người dùng, thì bạn có thể bỏ qua cảnh báo này.

3

Dường như PMD giả định rằng bạn đang gọi System.out.println() cho mục đích gỡ lỗi; những thứ như "Im trong phương pháp ur, thực thi codez ur".

Nếu bạn đang làm điều đó, bạn sẽ có một thời gian tốt hơn để viết cho một bộ ghi như Log4J, vì nó sẽ có nhiều tùy chọn phát trực tuyến hơn là chỉ để sàng lọc.

Nếu, tuy nhiên, bạn đang thực hiện một ứng dụng bảng điều khiển và đang gọi System.out là một phần của điều đó, hãy bỏ qua cảnh báo.

0

System.out.println không tốt để sử dụng vì không thể định cấu hình được. Thay vào đó, Logger có thể được định cấu hình để đăng nhập ở các cấp khác nhau. Nó có rất nhiều tính năng khác.

5

Liên kết này cung cấp thông tin ngắn gọn hơn về cách sử dụng Log4j: Don't use System.out.println! Tuy nhiên, bạn chỉ nên đặt một thư viện vào /jre/lib/ext, nhưng chỉ trong đường dẫn thời gian chạy của ứng dụng và gửi nó.

Lợi thế là bạn có thể sử dụng mức ghi nhật ký để cho biết tầm quan trọng của thông tin, để bạn có thể định cấu hình bên ngoài mức hiển thị/ẩn trong đầu ra (để bạn không bị khó chịu bởi - thông tin vô ích), làm thế nào đầu ra sẽ giống như (ví dụ bao gồm dấu thời gian, ID luồng, tên lớp, tên phương thức, v.v.) và nơi đầu ra sẽ được ghi vào (ví dụ: bảng điều khiển, tệp, email, v.v) và trong trường hợp của các tập tin ví dụ cũng làm thế nào họ nên được tạo ra (ví dụ như nhóm theo năm, tháng và/hoặc ngày).

Có một số việc triển khai logger như Java SE của BUILTIN java.util.logging.Logger, các convenienced Apache Commons Logging, phổ biến Apache Log4j, người kế nhiệm của nó Logback, vv Bạn có thể sử dụng Slf4j như một lớp trừu tượng thêm để chuyển qua lại giữa bất kỳ của những người khai thác gỗ bất cứ khi nào cần thiết.

11

Nếu bạn đang sử dụng System.out | err.println (..) để in ra thông tin người dùng trên bàn điều khiển trong phương thức main() của ứng dụng, bạn không làm gì sai. Bạn có thể loại bỏ thông điệp bằng cách chèn một chú thích "// NOPMD".

System.out.println("Fair use of System.out.println(..).");// NOPMD 

Có "Đánh dấu là đã đánh giá" - Tùy chọn trong Phác thảo vi phạm PMD cho mục đích này.

Tất nhiên bạn có thể đánh lừa PMD với đoạn mã sau:

PrintStream out=System.out; 
out.println("I am fooling PMD."); 

Bên ngoài của bạn main() - Phương pháp sử dụng một Log-System như ví dụ Log4j.

UPDATE:

Bạn cũng có thể thay đổi PMD-Rule "SystemPrintln" để sử dụng XPath sau:

//MethodDeclaration[@MethodName!="main"]//Name[ 
starts-with(@Image, 'System.out.print') 
or 
starts-with(@Image, 'System.err.print') 
] | //Initializer//Name[ 
starts-with(@Image, 'System.out.print') 
or 
starts-with(@Image, 'System.err.print') 
] 

này sẽ bỏ qua System.out.println vv trong bất kỳ phương thức có tên ' chính 'trong mã của bạn, nhưng kiểm tra System.out.println trong mã khởi tạo. Tôi thích điều này, vì theo quan điểm của tôi, System.out.println là an toàn trong phương thức 'chính (String args [])'. Nhưng sử dụng thận trọng, tôi phải kiểm tra, ở đâu trong AST, System.out.println cũng có thể xảy ra và phải thích ứng với XPath.

4

Trình ghi nhật ký có nhiều cấp độ để ghi nhật ký.

Nếu chúng tôi viết một chương trình ngắn thực sự, chỉ vì mục đích học tập System.out.println là tốt nhưng khi chúng tôi đang phát triển một dự án phần mềm chất lượng, chúng ta nên sử dụng trình ghi nhật ký chuyên nghiệp và SOP.

Trình ghi nhật ký chuyên nghiệp cung cấp các cấp khác nhau để ghi nhật ký và linh hoạt. Chúng tôi có thể nhận được thông điệp tường trình cho phù hợp. Ví dụ: các tin nhắn nhóm X chỉ được in trên PRODUCTION, các tin nhắn nhóm Y phải được in trên ERROR, v.v.

Chúng tôi có tùy chọn giới hạn để chuyển hướng thư trong số System.out, nhưng trong trường hợp logger bạn có các trình cung cấp cung cấp số tùy chọn. Chúng tôi thậm chí có thể tạo tùy chọn đầu ra tùy chỉnh và chuyển hướng nó đến đó.