2008-11-17 31 views
15

Nhiều lần tôi thấy ghi lỗi như thế này:Các phương pháp hay nhất để ghi lại lỗi là gì?

System.out.println("Method aMethod with parameters a:"+a+" b: "+b); 
print("Error in line 88"); 

vì vậy .. thực tiễn tốt nhất để ghi lại một lỗi là gì?

EDIT:

Đây là java nhưng có thể là C/C++, cơ bản, vv

Trả lời

8

Apache Commons Logging không dành cho các ứng dụng khai thác gỗ nói chung. Nó được dự định sẽ được sử dụng bởi các thư viện hoặc API mà không muốn ép buộc thực thi ghi nhật ký trên người dùng API.

Ngoài ra còn có các vấn đề về tải lớp với Ghi nhật ký.

Chọn một trong số [nhiều] đăng nhập api, được sử dụng rộng rãi nhất có thể là log4j hoặc Java Logging API.

Nếu bạn muốn độc lập triển khai, bạn có thể muốn xem xét SLF4J, bởi tác giả gốc của log4j.

Sau khi chọn triển khai, hãy sử dụng mức ghi/mức độ nghiêm trọng trong việc triển khai đó liên tục để nhật ký tìm kiếm/lọc dễ dàng hơn.

+0

Các tính năng này thường có các tính năng nâng cao như tự động đăng nhập nguồn và lọc theo vị trí cấp OR. Điều này làm cho việc gỡ lỗi dễ dàng hơn nhiều. Sử dụng một trong số này! (cũng kiểm tra Chainsaw) –

0

Thật sự không có thực hành tốt nhất để đăng nhập một lỗi. Về cơ bản, nó chỉ cần tuân theo một mẫu nhất quán (trong phần mềm/công ty/etc) cung cấp đủ thông tin để theo dõi vấn đề. Ví dụ, bạn có thể muốn theo dõi thời gian, phương pháp, thông số, phương pháp gọi vv

Vì vậy, miễn là bạn không chỉ cần in "Lỗi trong"

2

Cách dễ nhất để đăng nhập sai sót trong một định dạng nhất quán là sử dụng khung đăng nhập như Log4j (giả sử bạn đang sử dụng Java). Nó rất hữu ích để bao gồm một phần đăng nhập trong các tiêu chuẩn mã của bạn để đảm bảo rằng tất cả các nhà phát triển biết những gì cần phải được đăng nhập. Điều thú vị về hầu hết các khung công tác ghi nhật ký là chúng có các mức ghi khác nhau để bạn có thể kiểm soát cách ghi nhật ký tiết kiệm giữa phát triển, thử nghiệm và sản xuất.

2

Một Cách tốt nhất là sử dụng khuôn khổ java.util.logging

Sau đó, bạn có thể đăng nhập thông điệp trong một trong những định dạng

log.warning(".."); 
log.fine(".."); 
log.finer(".."); 
log.finest(".."); 

Hoặc

log.log(Level.WARNING, "blah blah blah", e); 

Sau đó, bạn có thể sử dụng một logging.properties (ví dụ dưới đây) để chuyển đổi giữa các mức ghi nhật ký và thực hiện tất cả các loại công cụ thông minh như đăng nhập vào các tệp, với xoay vòng, v.v.

handlers = java.util.logging.ConsoleHandler 

.level = WARNING 

java.util.logging.ConsoleHandler.level = ALL 

com.example.blah = FINE 
com.example.testcomponents = FINEST 

Các khung như log4j và các thứ khác nên tránh theo ý kiến ​​của tôi, Java có mọi thứ bạn cần.

EDIT

này có thể áp dụng như một thực tế chung của bất kỳ ngôn ngữ lập trình. Việc có thể kiểm soát tất cả các mức ghi nhật ký từ một tệp thuộc tính duy nhất thường rất quan trọng trong các ứng dụng doanh nghiệp.

2

Một số gợi ý thực hành tốt nhất

  • Sử dụng một khung đăng nhập. Điều này sẽ cho phép bạn:

    • Dễ dàng thay đổi điểm đến của thông điệp đăng nhập của bạn
    • điệp
    • Lọc log dựa trên mức độ nghiêm trọng
    • Hỗ trợ tin nhắn đăng nhập được quốc tế hóa
  • Nếu bạn đang sử dụng java, sau đó slf4j hiện được ưu tiên là Jakarta commons logging làm mặt tiền ghi nhật ký.

  • Như đã nêu slf4j là mặt tiền và sau đó bạn phải chọn triển khai cơ bản. Hoặc là log4j, java.util.logging hoặc 'đơn giản'.

  • Làm theo lời khuyên của khuôn khổ của bạn để đảm bảo expensive logging operations không không cần thiết tiến hành

0

API ghi nhật ký chung apache như đã đề cập ở trên là tài nguyên tuyệt vời. Đề cập trở lại java, đó cũng là một luồng đầu ra lỗi chuẩn (System.err).

Trực tiếp từ API Java:

dòng này đã được mở và sẵn sàng để chấp nhận dữ liệu đầu ra.

Thông thường luồng này tương ứng với đầu ra hiển thị hoặc đầu ra khác đích được chỉ định bởi máy chủ lưu trữ môi trường hoặc người dùng. Theo quy ước, output stream này được sử dụng để hiển thị thông báo lỗi hoặc thông tin khác rằng nên đến sự chú ý ngay lập tức của một người sử dụng ngay cả khi output stream chính, giá trị của biến ra ngoài, đã được chuyển để một tệp hoặc đích khác là thường không được giám sát liên tục.

22

Ghi nhật ký trực tiếp vào bảng điều khiển là khủng khiếp và thẳng thắn, dấu ấn của một nhà phát triển thiếu kinh nghiệm. Lý do duy nhất để làm điều này là 1) người đó không biết các cách tiếp cận khác, và/hoặc 2) nhà phát triển đã không suy nghĩ một chút về điều sẽ xảy ra khi mã của họ được triển khai đến một trang web sản xuất và cách ứng dụng sẽ được duy trì tại thời điểm đó. Xử lý một ứng dụng đang ghi nhật ký gỡ lỗi hoàn toàn không cần thiết 1GB/ngày trở lên là rất đáng buồn.

Các chung được chấp nhận thực hành tốt nhất là sử dụng một khuôn khổ Logging có khái niệm về:

  1. đối tượng đăng nhập khác nhau - các lớp học khác nhau/modules/etc có thể đăng nhập để logger khác nhau, vì vậy bạn có thể chọn để áp dụng đăng nhập khác nhau cấu hình cho các phần khác nhau của ứng dụng.
  2. Mức nhật ký khác nhau - vì vậy bạn có thể tinh chỉnh cấu hình ghi nhật ký thành chỉ nhật ký lỗi trong sản xuất, để ghi nhật ký tất cả các loại thông tin gỡ lỗi và theo dõi trong môi trường phát triển, v.v. cấu hình trong đó đầu ra nhật ký được gửi tới mà không yêu cầu bất kỳ thay đổi nào trong cơ sở mã. Một số ví dụ về những nơi khác nhau mà bạn có thể muốn gửi dữ liệu ghi nhận để là các tập tin, tập tin mà cuộn trên dựa trên ngày/kích thước, cơ sở dữ liệu, email, bồn Remoting vv
  3. Khung đăng nhập nên không bao giờ không bao giờ bao giờ ném bất kỳ Trường hợp ngoại lệ hoặc lỗi nào từ mã đăng nhập. Ứng dụng của bạn không nên tải hoặc không khởi động được vì khung nhật ký không thể tạo tệp nhật ký của nó hoặc lấy khóa trên tệp (trừ khi đây là yêu cầu quan trọng, có thể vì lý do pháp lý, đối với ứng dụng của bạn).

Khung nhật ký cuối cùng bạn sẽ sử dụng dĩ nhiên sẽ phụ thuộc vào nền tảng của bạn. Một số tùy chọn chung:

0

Bên cạnh đặc điểm kỹ thuật từ câu trả lời khác thì nên log một thông điệp ý nghĩa và có lẽ một số bước để tránh lỗi trong tương lai. Tùy thuộc vào lỗi, tất nhiên.

Bạn có thể nhận được nhiều hơn từ lỗi I/O khi thông báo nêu rõ điều gì đó như "Không thể đọc từ tệp X, bạn không có quyền thích hợp".

Xem thêm ví dụ về SO hoặc search the web.

Các vấn đề liên quan