Отключить общий журнал регистрации 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");
}
}