2009-09-17 37 views
30

Tôi đang sử dụng thư viện Ghi nhật ký chung Apache trong ứng dụng độc lập của mình. Sau khi tìm kiếm trên web, tôi cố gắng tắt ghi nhật ký bằng cách sử dụngTắt Apache Common Logging

package javaapplication1; 

import org.apache.commons.logging.Log; 
import org.apache.commons.logging.LogFactory; 

/** 
* 
* @author yccheok 
*/ 
public class Main { 

    /** 
    * @param args the command line arguments 
    */ 
    public static void main(String[] args) { 
     // TODO code application logic here 
     System.setProperty("org.apache.commons.logging.Log", "org.apache.commons.logging.impl.NoOpLog"); 

     log.info("You do not want to see me"); 
    } 

    private static final Log log = LogFactory.getLog(Main.class); 
} 

Tuy nhiên, tôi vẫn thấy thông báo tường trình được in. Tôi có thể biết tôi đã bỏ lỡ điều gì không?

tôi có thể tắt đăng nhập bằng cách đặt

# Sample ResourceBundle properties file 
org.apache.commons.logging.Log=org.apache.commons.logging.impl.NoOpLog 

trong commons-logging.properties.

Tuy nhiên, trong thời gian phát triển của tôi, Netbeans của tôi không biết nơi để nhận được commons-logging.properties, và đôi khi tôi cần phải tắt đăng nhập trong thời gian phát triển.

Trả lời

42

Như những người khác đã chỉ ra, điều này xảy ra bởi vì bạn tạo ra các đối tượng Log trước bạn thiết lập thuộc tính.

Một khoảng cách này sẽ được thiết lập thuộc tính trong khối initialiser tĩnh lớp Main của bạn - điều này sẽ được chạy khi lớp đầu tiên được nạp, và trước khi static final Log được tạo ra:

public class Main { 

    static { 
     System.setProperty("org.apache.commons.logging.Log", 
         "org.apache.commons.logging.impl.NoOpLog"); 
    } 

    // Rest of class as before 
} 
+4

Nó chỉ hoạt động. Tôi hài lòng với đề xuất của bạn. –

+0

Bạn có biết cách vô hiệu hóa org.apache.commons.logging.Log trong JRuby không? Tôi đang sử dụng: 'require 'java' java :: lang.static { java :: lang.System.setProperty (" org.apache.commons.logging.Log "," org.apache.commons.logging.impl. NoOpLog ") }' nhưng không có gì ... – user3719188

+0

Ý tưởng tuyệt vời !!! (+1) !!! – DebanjanB

5

Một cách tiếp cận khác có thể là - trong khi phát triển - để sử dụng dự án slf4j để kiểm soát ghi nhật ký.

Sử dụng cầu nối ghi nhật ký để thay thế nhật ký ghi chú Apache bằng sljf4 và sau đó sử dụng phụ trợ ghi nhật ký phù hợp. Ví dụ. slf4j thực hiện đơn giản hoặc NOP sẽ hợp lý cho bạn. Đây chỉ là một vài lọ bạn thả trong classpath của bạn.

Xem http://www.slf4j.org/legacy.html#jcl-over-slf4j

3

Vấn đề với ví dụ của bạn là lớp Log được khởi tạo trước khi tài sản được thiết lập. Nếu bạn tạo cá thể bản ghi sau khi thuộc tính được đặt, ví dụ hoạt động đúng. Ví dụ, nếu bạn di chuyển nó vào phương pháp chính:

package javaapplication1; 

import org.apache.commons.logging.Log; 
import org.apache.commons.logging.LogFactory; 

/** 
* 
* @author yccheok 
*/ 
public class Main { 

    /** 
    * @param args the command line arguments 
    */ 
    public static void main(String[] args) { 
     // TODO code application logic here 
     System.setProperty("org.apache.commons.logging.Log", 
          "org.apache.commons.logging.impl.NoOpLog"); 
     Log log = LogFactory.getLog(Main.class); 

     log.info("You do not want to see me"); 
    } 

} 
6

Như những người khác đã chỉ ra, cá thể log của bạn được khởi tạo trước khi thuộc tính hệ thống được đặt, quá sớm.

Hãy thử chuyển số -Dorg.apache.commons.logging.Log=org.apache.commons.logging.impl.NoOpLog cho JVM của bạn để đảm bảo thiết bị được đặt vào đúng thời điểm.