2009-09-17 137 views
30

我在獨立應用程序中使用Apache通用日誌記錄庫。在通過網絡搜索後,我嘗試通過使用關閉Apache通用日誌記錄

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); 
} 

但是,我仍然可以看到正在打印的日誌消息。我可以知道我錯過了什麼嗎?

我可以把

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

在commons-logging.properties關閉日誌記錄。

但是,在我的開發期間,我的Netbeans不知道在哪裏獲得commons-logging.properties,有時我需要在開發期間關閉日誌記錄。

回答

42

正如其他人所指出的那樣,這種情況正在發生,因爲在創建日誌對象設置屬性以前。解決此

的一種方法是設置屬性在Main類的靜態初始化器塊 - 這將是運行時首先加載的類,靜態最後登錄之前創建:

public class Main { 

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

    // Rest of class as before 
} 
+4

它只是工作。我對你的建議感到滿意。 – 2009-09-18 03:29:44

+0

您是否知道如何在JRuby中禁用org.apache.commons.logging.Log?我正在使用:'require'java'java :: lang.static { java :: lang.System.setProperty(「org.apache.commons.logging.Log」,「org.apache.commons.logging.impl。 NoOpLog「) }'但它什麼也沒有... – user3719188 2015-08-20 12:13:05

+0

好主意!!! (+1)!!! – DebanjanB 2018-01-17 11:27:01

5

一個不同的方法可以 - 在開發中 - 使用slf4j項目來控制日誌記錄。

使用commonds日誌橋代替Apache COmmons使用sljf4進行日誌記錄,然後使用合適的日誌記錄後端。例如。 slf4j簡單或NOP實現對你來說是合理的。這些只是你在類路徑中放置的幾個瓶子。

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

3

的問題,您的例子是設置屬性之前的日誌類實例化。如果在設置屬性後創建Log實例,則示例可正常工作。例如,如果你將其移動到主方法:

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

正如其他人指出的那樣,您的log實例在系統屬性設置之前被實例化,這爲時尚早。

嘗試將-Dorg.apache.commons.logging.Log=org.apache.commons.logging.impl.NoOpLog傳遞給您的JVM以確保它設置在正確的時間。

相關問題