2009-09-17 15 views
30

Estoy utilizando la biblioteca Apache Common Logging en mi aplicación independiente. Después de buscar en la web, trato de desactivar el registro mediante el uso deDesactivar el registro común de 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); 
} 

Sin embargo, todavía puedo ver el mensaje de registro que se está imprimiendo. ¿Puedo saber qué me había perdido?

puedo desactivar el registro poniendo

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

en commons-logging.properties.

Sin embargo, durante mi tiempo de desarrollo, mi Netbeans no sabe dónde conseguir commons --logging.properties, y a veces tengo que desactivar el registro durante el tiempo de desarrollo.

Respuesta

42

Como otros han señalado, esto está sucediendo porque se crea el registro de objeto antes se establece la propiedad.

Una forma de evitar esto sería establecer la propiedad en el bloque inicializador estático tu clase Main - esto se llevará a cabo la primera vez que se carga la clase, y antes de que se crea la final Log estática:

public class Main { 

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

    // Rest of class as before 
} 
+4

Simplemente funciona. Estoy contento con tu sugerencia. –

+0

¿Sabes cómo deshabilitar org.apache.commons.logging.Log en JRuby? Estoy usando: 'require 'java' java :: lang.static { java :: lang.System.setProperty (" org.apache.commons.logging.Log "," org.apache.commons.logging.impl. NoOpLog ") }' pero no hace nada ... – user3719188

+0

¡¡¡Gran idea !!! (+1) !!! – DebanjanB

5

Un enfoque diferente podría ser, durante el desarrollo, utilizar el proyecto slf4j para controlar el registro.

Utilizando el puente de inicio de sesión de commons para reemplazar el registro de Apache COmmons con sljf4 y luego usar un backend de inicio de sesión adecuado. P.ej. la implementación slf4j simple o NOP sería razonable para usted. Estos son solo algunos jarrones que debes colocar en tu classpath.

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

3

El problema con el ejemplo es que la clase Log se crea una instancia antes de la propiedad se establece. Si crea la instancia de registro una vez que se establece la propiedad, el ejemplo funciona correctamente. Por ejemplo si se mueve en el principal método:

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

Como otros señalaron, su instancia log se instancia antes de que se establezca la propiedad del sistema, que es demasiado pronto.

Pruebe pasar -Dorg.apache.commons.logging.Log=org.apache.commons.logging.impl.NoOpLog a su JVM para asegurarse de que esté configurado en el momento correcto.

Cuestiones relacionadas