2009-09-17 6 views
30

J'utilise la bibliothèque Apache Common Logging dans mon application autonome. Après une recherche sur le web, je tente de désactiver l'enregistrement à l'aideDésactiver 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); 
} 

Cependant, je peux encore voir le message du journal en cours d'impression. Puis-je savoir ce que j'avais manqué?

Je peux désactiver l'enregistrement en mettant

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

dans commons-logging.properties.

Cependant, au cours de mon développement, mon Netbeans ne sait pas où se procurer commons-logging.properties, et parfois je dois désactiver la journalisation pendant le temps de développement.

Répondre

42

Comme d'autres l'ont souligné, ce qui se passe parce que vous créez le journal objet avant vous définissez la propriété.

Une façon de contourner ce serait de définir la propriété dans votre Main classe de bloc initialiseur statique - ce sera exécuté lorsque la classe est d'abord chargé, et avant la finale statique journal est créé:

public class Main { 

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

    // Rest of class as before 
} 
+4

Cela fonctionne juste. Je suis content de votre suggestion. –

+0

Savez-vous comment désactiver org.apache.commons.logging.Log dans JRuby? J'utilise: 'require 'java' java :: lang.static { java :: lang.System.setProperty (" org.apache.commons.logging.Log "," org.apache.commons.logging.impl. NoOpLog ") }' mais ça ne fait rien ... – user3719188

+0

Super idée !!! (+1) !!! – DebanjanB

5

Une approche différente pourrait être - en cours de développement - d'utiliser le projet slf4j pour contrôler la journalisation. Utilisation du pont de consignation des commutateurs pour remplacer la consignation Apache COmmons par sljf4, puis utiliser un backend de journalisation approprié. Par exemple. la mise en œuvre simple ou NOP slf4j serait raisonnable pour vous. Ce ne sont que quelques pots que vous laissez tomber dans votre chemin de classe.

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

3

Le problème avec votre exemple est que la classe Log est instancié avant que la propriété est définie. Si vous créez l'instance de journal après la définition de la propriété, l'exemple fonctionne correctement. Par exemple, si vous vous déplacez dans la principale méthode:

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

Comme d'autres l'ont souligné, votre instance log est instanciée avant que la propriété système soit définie, ce qui est trop tôt. Essayez de transmettre -Dorg.apache.commons.logging.Log=org.apache.commons.logging.impl.NoOpLog à votre JVM pour vous assurer qu'elle est définie au bon moment.

Questions connexes