2009-09-17 2 views
30

독립 실행 형 응용 프로그램에서 Apache Common Logging 라이브러리를 사용하고 있습니다. 웹을 통해 검색 한 후에는 로깅을 끄려 고 시도합니다.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); 
} 

그러나 여전히 로그 메시지가 인쇄되는 것을 볼 수 있습니다. 나는 무엇을 놓친 지 알 수 있습니까?

나는 commons-logging.properties에

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

으로 바꾸어 로깅을 해제 할 수 있습니다.

그러나 개발 기간 동안 내 Netbeans은 어디에서 commons-logging.properties를 얻을지 모르고 때로는 개발 시간 동안 로깅을 해제해야합니다.

답변

42

, 이런 일이 당신이 로그를 생성하기 때문에이 속성을 설정 전에 객체. 이 약

한 가지 방법은 Main 클래스의 정적 initialiser 블록의 속성을 설정하는 것 -이 클래스가 처음로드 될 때 실행하고 정적 최종 로그가 생성되기 전에됩니다

public class Main { 

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

    // Rest of class as before 
} 
+4

그냥 작동합니다. 나는 너의 제안에 만족해. –

+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

+0

좋은 아이디어 !!! (+1) !!! – DebanjanB

5

개발 중 - 로깅을 제어하기 위해 slf4j 프로젝트를 사용하는 다른 접근 방식이있을 수 있습니다.

commonds 로깅 브리지를 사용하여 Apache COmmons 로깅을 sljf4로 바꾸고 적절한 로깅 백엔드를 사용하십시오. 예 : slf4j 단순 또는 NOP 구현은 당신에게 합리적 일 것입니다. 이것들은 당신이 당신의 classpath에 떨어 뜨리는 몇 개의 항아리 들일뿐입니다.

이 예제 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으로 전달하여 적절한시기에 설정되어 있는지 확인하십시오.