#java #swing #logging #awt
#java #swing #ведение журнала #awt
Вопрос:
Я использую Java logging для записи сообщений журнала моего приложения в файл журнала и другие места назначения. Установив уровень журнала на FINE
, я также получаю (нежелательные) сообщения от AWT / Swing, такие как:
{0}, when grabbed {1}, contains {2}
и другие. Просматривая исходный код JDK (см., например, здесь), можно увидеть, что имя соответствующего регистратора является sun.awt.X11.grab.XWindowPeer
.
Что я понял из Java logging framework, так это то, что этот обработчик ведения журнала должен наследовать свой уровень журнала от своих родителей, например sun.awt
.
Я попробовал следующее:
Logger.getLogger("sun.awt").setLevel(Level.OFF);
но сообщения AWT / Swing debug по-прежнему отображаются в выходных данных журнала.
Каков рекомендуемый способ программного отключения этих сообщений журнала (при этом все еще разрешая FINE
сообщения из других источников)?
Комментарии:
1. Пожалуйста, обновите свой вопрос, чтобы показать, как вы получаете свой экземпляр logger и как вы его вызываете.
Ответ №1:
Если вы просто хотите регистрировать сообщения вашего собственного приложения, вы можете отключить все сообщения, а затем явно включить сообщения для вашего приложения:
Logger.getRootLogger().setLevel(Level.OFF);
Logger.getLogger("package.of.your.application").setLevel(Level.ALL);
Внутри файла свойств для ведения журнала (например, logging.properties) это было бы:
.level = OFF
package.of.your.application.level = ALL
Ответ №2:
Сегодня у меня была такая же проблема. При поиске в Google это верхний URL, и я не нахожу хорошего источника для ответа, поэтому я опубликую свой 🙂
Предполагая, что Андре использует java.util.logging
API, можно добавить Handler
который будет управлять форматом вашего журнала, используя setFormatter(Formatter newFormatter)
.
Итак, я расширил Formatter
и проверил, содержит ли класс журнала java.awt, javax.swing или sun.awt.
class MyFormatLog extends Formatter {
@Override
public String format(LogRecord record) {
if( !record.getSourceClassName().contains("java.awt") amp;amp;
!record.getSourceClassName().contains("javax.swing.") amp;amp;
!record.getSourceClassName().contains("sun.awt.") ) {
//format my output...
} else {
return "";
}
}
}
Ответ №3:
Я больше не мог найти метод getRootLogger () в классе Logger. Это то, что работает для меня:
logger = Logger.getLogger("my.package");
Logger l = logger;
while (l != null) {
l.setLevel(Level.OFF);
l = l.getParent();
}
logger.setLevel(Level.FINER);
Ответ №4:
Logger.getLogger("java.awt").setLevel(Level.OFF);
Logger.getLogger("sun.awt").setLevel(Level.OFF);
Logger.getLogger("javax.swing").setLevel(Level.OFF);
Ответ №5:
Попробуйте Logger.getRootLogger().setLevel(Level.OFF);