2012-06-20 36 views
21

Cách sử dụng AsyncAppender trong log4j để viết thông điệp tường trình vào dịch vụ web? Tôi có nên tạo ứng dụng riêng của mình để mở rộng AsyncAppender hoặc chỉ đính kèm các ứng dụng tùy chỉnh vào AsyncAppender không? Nếu lựa chọn thứ hai là chính xác, tôi nên lấy đối tượng AsyncAppender ở đâu? Có ví dụ nào không?Làm thế nào để sử dụng AsyncAppender trong log4j?

Trả lời

-4

Trả lời câu hỏi của riêng tôi.

Trong tệp cấu hình log4j (thường là log4j.xml hoặc log4j.properties), chúng ta nên định nghĩa AsyncAppender sẽ tham chiếu đến appender thực (có thể là lớp được định nghĩa riêng của chúng ta như trong trường hợp của tôi).

Vì vậy, tôi đã viết một lớp WebServiceAppender mở rộng AppenderSkeleton và triển khai 3 phương pháp trừu tượng. Phương pháp chính là "nối thêm" kết nối với dịch vụ web và gửi tất cả thông tin đến đó. Đó là nó.

+19

vui lòng cung cấp mã ví dụ của bạn cho người dùng khác. cảm ơn – philipp

+2

bạn có thể vui lòng cung cấp mã hoặc vài dòng không? –

35

Thêm AsyncAppender vào tệp cấu hình log4j sẽ đề cập đến một ứng dụng thực sự. Đối với bản demo: thêm asyncappender để an ủi appender trong log4j.xml

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd" > 
<log4j:configuration> 
<appender name="console" class="org.apache.log4j.ConsoleAppender"> 
    <layout class="org.apache.log4j.PatternLayout"> 
     <param name="ConversionPattern" value="[%p] %d{dd MMM hh:mm:ss aa} %t [%l] %m%n"/> 
    </layout> 
</appender> 
<appender name="async" class="org.apache.log4j.AsyncAppender"> 
    <param name="BufferSize" value="500"/> 
    <appender-ref ref="console"/> 
</appender> 
<root> 
    <priority value="all"></priority> 
    <appender-ref ref="async"/> 
</root> 
</log4j:configuration> 
+3

Vì lý do hiệu suất, tốt nhất là luôn hạn chế mức độ ưu tiên gốc ở mức cao hơn. Xem http://stackoverflow.com/a/13144054/603516. – Vadzim

+2

Bạn có thể cung cấp cùng ví dụ nhưng ở định dạng tệp log4j.properties không? –

+0

số dòng sẽ không hiển thị – fudy

9

Chúng tôi muốn sử dụng log4j.AsyncAppender nhưng không thể tìm thấy bất kỳ phương pháp setter để đính kèm appenders khác tại file log4j.property. Vì vậy, chúng tôi đã mở rộng lớp log4j.AsyncAppender và thêm một setter để thêm các appender khác. Điều này đã giúp thread chương trình chính độc lập với hoạt động khai thác gỗ của log4j. Chi tiết bên dưới.

nhập log4j:

Xác định một logger 'com.noPath' với log4j file appender, 'fileAppender'. Lưu ý rằng đường dẫn logger là không đáng kể và do đó tên 'com.noPath'

log4j.logger.com.noPath=DEBUG,fileAppender 
log4j.appender.fileAppender=org.apache.log4j.RollingFileAppender 
log4j.appender.fileAppender.File=c:/test.log 

Xác định logger rằng nhu cầu kinh doanh, 'com.business', Gắn appender tập tin của bước trước, 'fileAppender', đến log4j AsyncAppender qua một lớp com.log.AsyncAppenderHelper tùy chỉnh kéo dài log4j AsyncAppender

log4j.logger.com.business=DEBUG,asyncLog 
log4j.appender.asyncLog=com.log.AsyncAppenderHelper 
log4j.appender.asyncLog.appenderFromLogger=com.noPath 

lớp java com.log.AsyncAppenderHelper mở rộng log4j.AsyncAppender, có nó có sẵn trong đường dẫn lớp.

package com.log 
import java.util.Enumeration; 
import org.apache.log4j.Appender; 
import org.apache.log4j.AsyncAppender; 
import org.apache.log4j.Logger; 

/* 
* This class helps configure to AsyncAppender from log4j as part of log4j.properties 
* You can inject other appenders to AsyncAppender using the AsyncAppenderHelper 
* This would free up the main program thread to be independent of log4j's logging operation 
* @Author http://www.linkedin.com/in/jobypgeorge 
*/ 

public class AsyncAppenderHelper extends AsyncAppender{ 

    public AsyncAppenderHelper(){ 
     super(); 
    } 

    public void setAppenderFromLogger(String name){ 
     Logger l = Logger.getLogger(name); 

     Enumeration<Appender> e = l.getAllAppenders(); 

     while(e.hasMoreElements()){ 
      Appender a = e.nextElement(); 
      this.addAppender(a); 
      System.out.println("The newAppender "+a.getName() +" attach status "+this.isAttached(a)); 
     } 

    } 
} 
+2

ví dụ hay về cách sử dụng trình bổ sung không đồng bộ trong log4j.properties – hudi

+0

Cẩn thận, điều này có thể dễ dàng phá vỡ. Tôi đã thử điều này nhưng PropertyConfigurator loại bỏ các appender và thêm lại chúng khi nó xử lý. AsyncAppenderHelper của tôi đã kết thúc với một appender đóng. Đây là lý do tại sao bạn cần phải sử dụng DomConfigurator (xml) để sử dụng nó. –

+1

@AlanYackel không có tùy chọn làm thế nào để sử dụng nó với log4j.properties? Tôi không thể sử dụng tệp xml – hudi

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