2009-06-12 2 views
1

Я использую протокол java.util.logging.Logger в моей программе. Как включить регистрацию FINE для одного класса, установив его на WARNING для каждого другого класса?Как включить ведение журнала FINE для одного класса Java

Я бы предпочел сделать это программно в моем методе main(), а не настраивать дополнительные файлы свойств.

+0

В основном такой же вопрос, как http://stackoverflow.com/questions/470430/java-util-logging-logger-doesnt-respect-java-util-logging-level. –

ответ

1
Logger log = Logger.getLogger(this.getClass().getName()).setLevel(Level.FINE); 
+0

Это близко, но не работает по двум причинам: 1) Я хочу, чтобы иметь возможность поместить код в мой основной класс, поэтому не все пользователи моего класса утилиты должны видеть журнал FINE. 2) Кажется, что даже если я сделаю то, что вы предложили, обработчик все еще глотает все мои сообщения FINE. – 2009-06-12 15:20:17

0

Я считаю, что вы можете установить уровень протоколирования для Handler и вашего конкретного класса Logger к FINE, сохраняя при этом все остальные Logger с для остальной части кода базы предупредительного должен сделать трюк. И Logger, и Handler необходимо передать фильтр уровня для сообщения, которое должно быть зарегистрировано.

0

Если вы не хотите, чтобы логгер определялся для каждого рассматриваемого класса, но вместо этого нужно делиться регистраторами между классами, вы также можете реализовать свой собственный java.util.logging.Handler, который имеет свой собственный способ фильтрации для имена классов, используя информацию, предоставленную LogRecord.getSourceClassName().

0

Ну, вот метод, который я добавил в мой класс почты, который фактически работает. Я по-прежнему приветствую любые улучшения от других.

private static void setupLogging() { 
    // To enable FINE logging in a single class, apparently this bewildering 
    // maze of statements is required. 
    Logger.getLogger("").setLevel(Level.FINE); 
    for (Handler handler : Logger.getLogger("").getHandlers()) { 
    handler.setLevel(Level.FINE); 
    } 
    MyOtherClass.logger.setLevel(Level.FINE); 
    Logger.getLogger("").setLevel(Level.WARNING); 
} 
0

Я знаю, что ОП попросил сделать это программно, но вот пример того, как это сделать в файле свойств тоже.

Предостережение: Я думал, что это достойно включения, поскольку заголовок не указывает на программную реализацию, и многие разработчики захотят управлять им через logging.properties. Также на самом деле не очень много он-лайн об этом, он может быть запутанным и немного отличается от, скажем, log4j

Уровень корневого ведения журнала указан конфигурацией .level. Это определяет, какие события по умолчанию должны быть захвачены и «распределены для» ведения журнала. Уровень корневого ведения журнала - это уровень, используемый «корневым регистратором» в иерархии протоколирования. См. this onjava article for more info on the logging hierarchy.

Ниже указателя уровня журнала журнала установлено значение WARNING, поэтому обычно регистрируются только события WARNING. Это наследуется всеми дочерними лесорубов в иерархии, если не настроить иначе (позже):

.level=WARNING 

Этот уровень корневой каротаж указывает только то, что улавливается, а не то, что «распределено». Как распределяется захваченное событие (сообщение) до тех, кто связан с регистратором. Например, ConsoleHandler выведет событие на консоль. Например:

java.util.logging.ConsoleHandler.level = WARNING 

Это ConsoleHandler.level указывает на уровень, для которого этот обработчик должен распространять - или печать - сообщение. Итак, если получено сообщение FINE с вышеуказанной конфигурацией, этот обработчик не распечатает его. Он будет печатать любые сообщения с уровнем журнала WARNING или выше.

Установка для ALL гарантирует, что ConsoleHandler будет печатать все сообщения на консоль (нам также необходимо настроить корневой уровень, чтобы обеспечить все захвачены):

.level=ALL 
java.util.logging.ConsoleHandler.level = ALL 

Однако, это создало бы много шума, которого мы также не хотим.Таким образом, чтобы уменьшить события FINE уровня для тех классов, мы заинтересованы в том, мы изменяем уровень протоколирования только тех конкретных лесорубов:

com.level = WARNING 
com.mypackage.MyClass1.level = FINE 
com.mypackage.MyClass2.level = FINE 
com.mypackage.mysubpackage.MyClass3.level = FINE 

Обратите внимание, что в приведенном выше, я явно задать уровень для «com» ​​в WARNING.

Смежные вопросы