2012-09-13 40 views
9

Tôi đã sử dụng log4j.Logger và tôi đã ghi giá trị nhật ký vào một tệp bằng cách sử dụng FileAppender.Cách nhận giá trị Logger trong một mảng chuỗi

Bây giờ tôi muốn hiển thị giá trị nhật ký trong vùng văn bản. Làm thế nào tôi có thể gán giá trị logger cho một mảng Strings?

+0

gì làm bạn thấy muốn? stacktrace? hoặc thông báo lỗi? – Jaiwo99

+0

tôi muốn hiển thị Level.TRACE – praba

+2

tôi không thấy đường trực tiếp và nếu bạn muốn hiển thị trong ứng dụng của mình, bạn có thể đọc tệp và hiển thị nó ở đó –

Trả lời

13

Bạn có thể thêm Appender bổ sung vào Logger của mình. Sử dụng một WriterAppender để viết thư cho một StringWriter sau đó bạn thay đổi nội dung của TextArea của bạn với giá trị của StringWriter#toString()

Ví dụ Code:

public static void main(String[] args) { 
    Logger logger = Logger.getLogger("logger"); 
    Layout layout = new PatternLayout(); 
    StringWriter stringWriter = new StringWriter(); 
    WriterAppender writerAppender = new WriterAppender(layout, stringWriter); 
    logger.addAppender(writerAppender); 
    TextArea textArea = new TextArea(); 

    logger.error("test"); 
    //if(stringWriter changed){// compare to old TextArea-content? 
     textArea.setText(stringWriter.toString()); 
    //} 
    //System.out.println(stringWriter.toString()); 
    } 

bạn cần phải tìm một cách thông minh cập nhật TextArea của bạn tùy thuộc vào LogLevel và nếu nội dung của số StringWriter thay đổi.

Cập nhật: Giải pháp có thể so sánh được trình bày here.

+2

+1 giải pháp tốt đẹp –

+0

stringWriter trả về giá trị rỗng. nó không phải là working.any suggesstions hoặc giải pháp – praba

+1

Bạn cần phải trình bày cho chúng tôi mã của bạn. Ví dụ của tôi ist làm việc tốt. – Simulant

3

Tôi sẽ viết một lớp mở rộng org.apache.log4j.AppenderSkeleton và (như API đề xuất) ghi đè phương thức append(org.apache.log4j.spi.LoggingEvent). Với số LoggingEvent bạn nhận được tất cả thông tin cần thiết để tạo Chuỗi bạn muốn hiển thị. Ngoài ra, bạn có thể kiểm soát nơi để lưu các chuỗi đó. Bạn muốn có chúng trong một mảng String - không có vấn đề gì. Nếu bạn chỉ muốn ghi nhớ các sự kiện ghi nhật ký cuối cùng, bạn có thể sử dụng hàng đợi.

Ở đây mã của tôi (đã thông qua một bài kiểm tra đơn giản):

import java.util.ArrayDeque; 
import java.util.Collection; 
import java.util.Collections; 

import org.apache.log4j.AppenderSkeleton; 
import org.apache.log4j.spi.LoggingEvent; 


public class StringArrayAppender extends AppenderSkeleton{ 

    private Collection<String> log; 

    private int size; 

    public StringArrayAppender(int size) { 
     this.log = new ArrayDeque<String>(size); 
     this.size = size; 
    } 

    public String[] getLog() { 
     return log.toArray(new String[0]); 
    } 

    @Override 
    protected void append(LoggingEvent event) { 
     // Generate message 
     StringBuilder sb = new StringBuilder(); 
     sb.append(event.getTimeStamp()).append(": "); 
     sb.append(event.getLevel().toString()).append(": "); 
     sb.append(event.getRenderedMessage().toString()); 
     // add it to queue 
     if(log.size() == size) { 
      ((ArrayDeque<String>) log).removeFirst(); 
     } 
     log.add(sb.toString()); 
    } 

    @Override 
    public void close() { 
     log = Collections.unmodifiableCollection(log); 
    } 

    @Override 
    public boolean requiresLayout() { 
     return false; 
    } 
} 
Các vấn đề liên quan