2012-03-23 43 views
5

Tôi đang cố gắng thêm trình xử lý nhật ký tùy chỉnh vào ứng dụng java của mình. Tôi đã thực hiện một lớp InnerLogger mở rộng lớp java.util.Logging.Handler. Và trong logging.properties tôi tuyên bố như một handler:Làm cách nào để thêm trình xử lý nhật ký tùy chỉnh vào Google App Engine?

handlers:com.mycompany.util.InnerLogger 

Nhưng khi tôi khởi động sever phát triển, tôi đã nhận lỗi sau:

Can't load log handler "com.mycompany.util.InnerLogger" 
java.lang.ClassNotFoundException: com.mycompany.util.InnerLogger 

tôi có thể thêm xử lý tùy chỉnh của tôi để logger từng người một , nhưng tôi chỉ tự hỏi là có cách nào để thêm nó vào tất cả các logger.

Cảm ơn

+0

liên quan: [Issue 11.499: Cho phép logger tùy chỉnh cho Java AppEngine] (https://code.google.com/p/googleappengine/issues/detail?id=11499) – jmehrens

Trả lời

3

Tôi có thể thêm Handler vào gốc Logger khi ứng dụng của tôi khởi tạo. Bạn có thể đặt mã này trong một nhiệm vụ khởi động hoặc bộ lọc servlet.

private static Logger LOG; 

... 

LOG = Logger.getLogger(""); 
LOG.addHandler(myCustomHandler); 

Không hiệu quả bằng cách sử dụng logging.properties, nhưng đây là giải pháp thích hợp khi chạy trên GAE.

+0

Điều này làm việc cho tôi, mặc dù nó đã tạo ra các câu lệnh đăng nhập trùng lặp vì tôi chỉ gọi là LOG.addHandler (myCustomHandler). Để khắc phục điều đó, bạn có thể loại bỏ các trình xử lý hiện có được trả về từ LOG.getHandlers(), rồi thêm trình xử lý tùy chỉnh của bạn. – sappenin

+0

+1 Công việc xung quanh vẫn cần thiết như GAE 1.9.1 và chúng ta có biết lý do kỹ thuật tại sao cài đặt trong logging.properties bị bỏ qua không? – Drux

2

Nó có thể không phải là giải pháp bạn đang tìm kiếm, nhưng có bạn xem là sử dụng Simple Logging Facade for Java (SLF4J) trong ứng dụng của bạn thay vì sử dụng trực tiếp tháng bảy?

+0

Đây là những gì tôi sẽ chỉ làm , bằng cách sử dụng SLF4J với Log4J và một appender tùy chỉnh. – aimless

1
public static void addStreamHandler(){ 

    // TODO check if appCode has X length 
    CustomHandler handler = new CustomHandler(); 
    LogManager manager = LogManager.getLogManager(); 
    Enumeration<String> e = manager.getLoggerNames(); 
    while (e.hasMoreElements()){ 

     Logger logger = manager.getLogger(e.nextElement()); 
     if (logger.getName().startsWith("com.google"))continue; 
     logger.addHandler(handler); 
     System.out.println(logger.getName()); 
    } 
    System.out.println("***finished*****"); 
} 

public static void removeStreamHandlers(){ 

    LogManager manager = LogManager.getLogManager(); 
    Enumeration<String> e = manager.getLoggerNames(); 
    while (e.hasMoreElements()){ 

     Logger logger = manager.getLogger(e.nextElement()); 
     Handler[] handlers = logger.getHandlers(); 
     for (int i = 0; i < handlers.length; i++){ 
      Handler h = handlers[i]; 
      if (h instanceof CustomHandler){ 
       logger.removeHandler(h); 
       break; 
      } 
     } 
    } 
} 
Các vấn đề liên quan