Отключение сообщений журнала отладки awt / swing (нормально)

#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);