2015-07-14 42 views
5

Tôi đang sử dụng lớp Logger của Java. Tôi muốn vượt qua ex.printStackTrace() vào Logger.log(loglevel, String), nhưng printStackTrace() trả lại void. Vì vậy, tôi không thể vượt qua và in dấu vết ngăn xếp của ngoại lệ.Làm cách nào để tôi ghi nhật ký ngăn xếp bằng cách sử dụng lớp Logger của java

Có cách nào để tôi có thể chuyển đổi void thành String hoặc có phương pháp nào khác để in toàn bộ dấu vết ngăn xếp của ngoại lệ không?

+1

viết tắt: NO, u có thể không. – Bikku

+1

Chắc chắn, hãy sử dụng điều này: https://commons.apache.org/proper/commons-lang/javadocs/api-3.4/org/apache/commons/lang3/exception/ExceptionUtils.html#getStackTrace(java.lang.Throwable) từ commons-lang3 3.4 – EpicPandaForce

+0

Loại giá trị chuỗi nào sẽ "không có gì" được chuyển thành? – user2864740

Trả lời

9

Bạn cần hiểu rằng void thực sự là nothingness. Bạn không thể biến đổi cái gì là gì cả. Bạn có thể kết thúc in void như một chuỗi, nhưng (tin tưởng tôi), bạn không muốn điều đó.

Tôi nghĩ rằng những gì bạn đang tìm kiếm là

// assuming ex is your Exception object 
logger.error(ex.getMessage(), ex); 
// OR 
Logger.log(errorLogLevel, ex.getMessage(), ex) 

này sẽ in thông báo lỗi bằng cách sử dụng logger mà bạn đã cấu hình. Để biết thêm chi tiết, bạn có thể xem tài liệu java cho Exception#getMessage()

+0

Cảm ơn Saif Asif. Tôi có thể đăng nhập toàn bộ dấu vết ngăn xếp ngay bây giờ. –

+2

'logger.error()' không phải là 'java.util.logging', nhưng tôi sẽ không downvote bạn vì tôi vui mừng khi khám phá ra' logger.log (Cấp độ, Ngoại lệ, Nhà cung cấp) '. Có vẻ như Oracle đã làm cho 'java.util.logging.Logger' nghiêm túc xấu xí! Vì họ đã làm điều đó, thật lạ lùng khi họ không tiếp tục và tạo ra 'logger.severe (String, Exception)' etc – Adam

6

Bạn không thể chuyển đổi void thành String; không có chuyển đổi như vậy tồn tại. void không trả lại mọi thứ trở lại, vì vậy bạn không có giá trị để truy xuất.

Điều bạn có thể muốn làm là nhận được thông báo về ngoại lệ thay vì qua số ex.getMessage().

0

Như Makoto nói, bạn có thể muốn làm một ex.getMessage().

Để làm rõ thêm, void có nghĩa là không có gì được trả lại. Bạn không thể bỏ gì vào nội dung nào đó :)

1

Bạn có thể sử dụng phương thức getStackTrace() để nhận một mảng StackTraceElements và tạo Chuỗi từ đó. Nếu không, nếu thông báo lỗi cuối cùng là đủ, hãy sử dụng phương thức getMessage() theo đề xuất của Makoto.

Để có được dấu vết ngăn xếp như một String từ một mảng của StackTraceElement đối tượng, bạn cần để lặp qua mảng (lấy từ nguồn JDK7):

StringBuilder builder = new StringBuilder(); 
StackTraceElement[] trace = getOurStackTrace(); 
    for (StackTraceElement traceElement : trace) 
     builder.append("\tat " + traceElement + "\n"); 

Một lựa chọn khác là sử dụng printStackTrace(PrintStream s), nơi bạn nhận được để xác định nơi bạn muốn stacktrace được in:

ByteArrayOutputStream out1 = new ByteArrayOutputStream(); 
PrintStream out2 = new PrintStream(out1); 
ex.printStackTrace(out2); 
String message = out1.toString("UTF8"); 
+1

Chỉ cần sử dụng thư viện apache commons ExceptionUtils; không cần phải tái tạo lại bánh xe – beresfordt

8

Sử dụng java.util.logging.Logger#log(Level, String, Throwable) và vượt qua trong ex như là đối số thứ ba như thế này:

LOGGER.log(Level.INFO, ex.getMessage(), ex); 
+0

Cảm ơn. Phương pháp này hoạt động tốt. –

+0

Tôi không nhận được dấu vết ngăn xếp để đăng nhập với điều này, chỉ có đối số thứ hai. –

+0

Có thể chặn dấu vết ngăn xếp bằng cách thay đổi định dạng nhật ký. Bạn đang sử dụng trình định dạng nào và định dạng nhật ký của bạn trông như thế nào? – hzpz

0

bạn CÓ THỂ chuyển đổi stacktrace thành Chuỗi bằng cách sử dụng bên dưới. Nếu e là đối tượng ngoại lệ

StringWriter stringWriter= new StringWriter(); 
PrintWriter printWriter= new PrintWriter(stringWriter); 
e.printStackTrace(printWriter); 
String stackTraceAsString= stringWriter.toString(); 
0

Có một phương thức in quá tảiStackTrace đưa vào PrintWriter.

Bạn có thể làm một cái gì đó như thế này

Writer buffer = new StringWriter(); 
PrintWriter pw = new PrintWriter(buffer); 
ex.printStackTrace(pw); 
Logger.log(loglevel, buffer.toString()); 
0

Cảm ơn tất cả các bạn.Tôi có thể ghi nhật ký chi tiết theo dõi ngăn xếp bằng cách sử dụng các chi tiết theo dõi ngăn xếp bằng cách sử dụng số điện thoại

LOGGER.log(Level.INFO, ex.getMessage(),ex); 
//ex is my exception object 
Các vấn đề liên quan