Отключить общий журнал регистрации Apache

Я использую библиотеку 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, а иногда мне нужно отключить ведение журнала во время разработки.

Ответ 1

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

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

public class Main {

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

   // Rest of class as before
}

Ответ 2

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

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

Ответ 3

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

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

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

Ответ 4

Проблема с вашим примером заключается в том, что класс журнала создается до того, как свойство установлено. Если вы создадите экземпляр журнала после того, как свойство установлено, пример работает правильно. Например, если вы переместите его в основной метод:

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

}