2012-02-20 31 views
14

Có cách nào để ghi nhật ký lỗi hoặc ngoại lệ vào tệp trong java hay không. tôi đã trải qua Log4j. Tôi googled về nó nhưng diidnt tìm thấy một giải pháp tốt. Tôi đã viết một mã đơn giảnCách viết nhật ký lỗi hoặc ngoại lệ vào tệp trong java

catch (Exception e) { 
    PrintWriter pw = new PrintWriter(new FileOutputStream("Log"));  
    e.printStackTrace(pw); 
} 

Có cách nào khác để ghi lại lỗi hoặc ngoại lệ không? có thể bất kỳ cơ thể cung cấp cho tôi wwith ví dụ mẫu của Log4j?

Trả lời

22

Đầu đọc log4j Manual, thật dễ dàng để định cấu hình tệp nhật ký cán. Bạn không phải thực hiện bất kỳ thao tác tệp rõ ràng nào.

#SET LEVEL of ROOT-LOGGER, you will like to have Debug in local, but in prod you may just want WARN and ABOVE. This setting is done here! 
log4j.rootLogger=debug, stdout, R 

log4j.appender.stdout=org.apache.log4j.ConsoleAppender 
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout 

# Pattern to output the caller's file name and line number. (basically, format of log) 
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] (%F:%L) - %m%n 

# THIS IS WHERE YOU WILL HAVE ALL THE LOG WRITTEN 
log4j.appender.R=org.apache.log4j.RollingFileAppender 
log4j.appender.R.File=/var/log/applogs/example.log 

# Maximum size of log file, usually we keep 10MB 
log4j.appender.R.MaxFileSize=100KB 
# Keep one backup file, usually we keep 10 
log4j.appender.R.MaxBackupIndex=1 

log4j.appender.R.layout=org.apache.log4j.PatternLayout 
log4j.appender.R.layout.ConversionPattern=%p %t %c - %m%n 

Thứ hai, bất cứ khi nào bạn bắt một ngoại lệ, làm như thế này

public class MyClass{ 

    private static Logger logger = Logger.getLogger(MyClass.class); 

    public ReturnType myMethod(Param p, Param2 p2) { 
    .... 
    .... 
    try { 
     ..  
    } catch(MyException e) { 
     logger.log("Exceptions happen!", e); //this will put all the details in log file configured earlier 
    } 
    .... 
    } 

    .... 
} 

Nó đáng đọc hướng dẫn. Thậm chí tốt hơn hãy đọc Complete log4j Manual

+1

và tôi phải làm gì khi các ngoại lệ không được kiểm tra xuất hiện? Làm thế nào tôi có thể chắc chắn rằng mọi thứ sẽ được gửi đến logger? – Blauhirn

+0

Sử dụng 'Throwable' để bắt * mọi thứ *. Không nên mặc dù. Bạn có thể muốn đọc các bài đăng sau: 1. http://stackoverflow.com/questions/6115896/java-checked-vs-unchecked-exception-explanation 2. http://stackoverflow.com/questions/2274102/difference-between -using-throwable-and-exception-in-a-try-catch – Nishant

+0

@Nishant Tệp nhật ký sẽ ở đâu? Nó nằm trong thư mục apache? – KJEjava48

2

Sử dụng log4j bạn có thể đăng exceptiosn khá dễ dàng:

try { 
    ... 
} catch(Exception e) { 
    log.error("An exception! Oops!", e); 
} 
4
try { 
     System.setErr(new PrintStream(new FileOutputStream(System.getProperty("user.home")+"/error.log"))); 
} catch (FileNotFoundException ex) { 
     ex.printStackTrace(); 
} 

Bây giờ tất cả sản lượng lỗi được viết vào tập tin này

+1

Mặc dù về mặt kỹ thuật chính xác, điều này tốt hơn thế nào so với sử dụng khung ghi nhật ký (log4j, juli, commons-logging etc)? – pap

+2

Tại sao sử dụng một khung công tác, khi bạn có thể giải quyết nó bằng các phương thức riêng của javas? – Thargor

+3

1: Không hỗ trợ mức log khác nhau 2: Không hỗ trợ cho bối cảnh chẩn đoán (chủ đề, lớp, phương pháp, vv) 3: Không hỗ trợ đầu ra định dạng tôi có thể tiếp tục. Bạn có thể đóng đinh bằng tuốc nơ vít, nhưng tại sao bạn không dùng búa nếu bạn có một cái đinh? – pap

3

Bạn có thể thêm ngoại lệ như một tham số để tuyên bố log4j của bạn, ví dụ

catch(Exception e) 
{ 
    logger.error("Unexpected error", e); 
} 

Miễn là bạn đã có một appender tập chạy OK, ý chí đầu ra này stack trace hoàn toàn ngoại lệ.

1

Look this tutorial about "File Appender"

Xem official Log4j short introduction và "Cấu hình" phần.

Bạn cũng có thể tìm kiếm về "RollingFileAppender" hoặc "Trình tải tệp".

Bạn định cấu hình trình ghi nhật ký của mình để gửi tin nhắn tới người phụ trách. appender này có thể chuyển tiếp thông điệp đối với giao diện điều khiển (stdin), hướng tới một tập tin (FileAppender, RollingFileAppender ...) ...

Sử dụng này để thực hiện bản ghi lỗi:

try{ 
    throw new Exception("bla bla bla..."); 
} catch(Exception e){ 
    // log without stack trace 
    mLogger.error("Your log message"); 

    // log with stack trace 
    mLogger.error("Your log message", e); 
} 
Các vấn đề liên quan