Trong ứng dụng của tôi, tôi đang chạy mã của mình thông qua PMD. Nó hiển thị cho tôi thông báo sau:
- Tránh printStackTrace (); sử dụng cuộc gọi ghi nhật ký thay thế.
Điều đó nghĩa là gì?
Trong ứng dụng của tôi, tôi đang chạy mã của mình thông qua PMD. Nó hiển thị cho tôi thông báo sau:
- Tránh printStackTrace (); sử dụng cuộc gọi ghi nhật ký thay thế.
Điều đó nghĩa là gì?
Câu trả lời:
Nó có nghĩa là bạn nên sử dụng khung ghi nhật ký như đăng lại hoặc là log4j và thay vì in trực tiếp các ngoại lệ:
e.printStackTrace();
bạn nên ghi lại chúng bằng cách sử dụng API của khung này:
log.error("Ops!", e);
Khung ghi nhật ký cung cấp cho bạn nhiều sự linh hoạt, ví dụ như bạn có thể chọn xem bạn muốn đăng nhập vào bảng điều khiển hoặc tệp - hoặc có thể bỏ qua một số thông báo nếu bạn thấy chúng không còn phù hợp trong một số môi trường.
Nếu bạn gọi printStackTrace()
một ngoại lệ, dấu vết được ghi vào System.err
đó và rất khó để định tuyến nó ở nơi khác (hoặc lọc nó). Thay vì làm điều này, bạn được khuyến nghị sử dụng khung ghi nhật ký (hoặc một trình bao bọc xung quanh nhiều khung ghi nhật ký, như Apache Commons Logging) và ghi ngoại lệ bằng cách sử dụng khung đó (ví dụ logger.error("some exception message", e)
).
Làm điều đó cho phép bạn:
Một chương trình chất lượng sản xuất nên sử dụng một trong nhiều lựa chọn thay thế ghi nhật ký (ví dụ: log4j, logback, java.util.logging) để báo cáo lỗi và các chẩn đoán khác. Điều này có một số lợi thế:
Ngược lại, nếu bạn chỉ sử dụng printStackTrace, người triển khai / người dùng cuối có rất ít quyền kiểm soát và thông báo ghi nhật ký có thể bị mất hoặc hiển thị cho người dùng cuối trong những trường hợp không thích hợp. (Và không có gì khiến người dùng nhút nhát kinh hoàng hơn là một dấu vết ngăn xếp ngẫu nhiên.)
Hầu hết mọi khung ghi nhật ký đều cung cấp một phương thức mà chúng ta có thể chuyển đối tượng có thể ném cùng với một thông báo. Giống:
public trace(Marker marker, String msg, Throwable t);
Họ in stacktrace của đối tượng có thể ném.
Hãy nói về khái niệm công ty. Nhật ký cung cấp cho bạn các cấp độ linh hoạt (xem Sự khác biệt giữa logger.info và logger.debug ). Những người khác nhau muốn xem các cấp độ khác nhau, như QAs, nhà phát triển, người kinh doanh. Nhưng e.printStackTrace () sẽ in ra mọi thứ. Ngoài ra, giống như nếu phương thức này sẽ được gọi lại, lỗi tương tự này có thể in nhiều lần. Sau đó, những người của Devops hoặc Tech-Ops trong công ty của bạn có thể phát điên lên vì họ sẽ nhận được những lời nhắc lỗi tương tự. Tôi nghĩ một sự thay thế tốt hơn có thể là log.error("errors happend in XXX", e)
Điều này cũng sẽ in ra toàn bộ thông tin dễ đọc hơn e.printStackTrace ()
Lý do chính là Proguard sẽ loại bỏ các cuộc gọi Nhật ký khỏi sản xuất. Bởi vì bằng cách ghi nhật ký hoặc in StackTrace, có thể thấy chúng (thông tin bên trong dấu vết ngăn xếp hoặc Nhật ký) bên trong điện thoại Android bằng ứng dụng Logcat Reader chẳng hạn. Vì vậy, nó là một thực hành xấu cho bảo mật. Ngoài ra, chúng tôi không truy cập chúng trong quá trình sản xuất, tốt hơn nên loại bỏ chúng khỏi sản xuất. Vì ProGuard loại bỏ tất cả các lệnh gọi Nhật ký không phải stackTrace, vì vậy tốt hơn nên sử dụng các khối bắt Đăng nhập và để chúng bị xóa khỏi Sản xuất bởi Proguard.