Отключите Apache Common Logging - PullRequest
       9

Отключите Apache Common Logging

31 голосов
/ 17 сентября 2009

Я использую библиотеку 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);
}

Однако я все еще вижу распечатанное сообщение журнала. Могу ли я узнать, что я пропустил?

Я могу отключить запись, поставив

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

в commons-logging.properties.

Однако во время разработки мои Netbeans не знают, где взять commons-logging.properties, и иногда мне нужно отключить ведение журнала во время разработки.

Ответы [ 4 ]

46 голосов
/ 17 сентября 2009

Как уже отмечали другие, это происходит потому, что вы создаете объект Log до того, как вы установите свойство.

Одним из способов решения этой проблемы является установка свойства в вашем статическом инициализаторе Main class '- он будет запущен при первой загрузке класса и до создания статического финального журнала:

public class Main {

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

   // Rest of class as before
}
6 голосов
/ 17 сентября 2009

Как отмечали другие, ваш экземпляр log создается до того, как задано системное свойство, что слишком рано.

Попробуйте передать -Dorg.apache.commons.logging.Log=org.apache.commons.logging.impl.NoOpLog в JVM, чтобы убедиться, что он установлен в нужное время.

6 голосов
/ 17 сентября 2009

При разработке можно использовать другой подход - использовать проект slf4j для управления журналированием.

Использование моста ведения журналов commonds для замены регистрации Apache COmmons на sljf4, а затем используйте подходящий бэкэнд регистрации. Например. простая реализация slf4j или NOP была бы разумной для вас. Это всего лишь несколько банок, которые вы помещаете в свой путь к классам.

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

3 голосов
/ 17 сентября 2009

Проблема с вашим примером заключается в том, что класс Log создается перед заданием свойства. Если вы создаете экземпляр 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");
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...