2016-04-19 2 views
2

В документации LogManager следующего устанавливаются свойства Обработчиков:В файле java.util.logging logging.properties в чем разница между «обработчиками» и «.handlers»?

свойства «Обработчики». Это определяет пробел или запятую, разделенные список имен классов для классов обработчиков для загрузки и регистрации в качестве обработчиков в корневом регистраторе (регистраторе с именем «»).

Недвижимость ".handlers". Это определяет пробел или запятую : список классов для классов обработчиков для загрузки и регистрируются как обработчики заданного регистратора. Каждое имя класса должно быть для класса Handler, у которого есть конструктор по умолчанию. Обратите внимание, что эти обработчики могут создаваться лениво, когда они впервые используются.

Поскольку имя корневого регистратора является пустая строка («»), мне кажется, как и из пунктов ниже, должны быть эквивалентны:

handlers = myHandler 
.handlers = myHandler 

Вот пример из Пб JDK в /logging.properties файл:

handlers= java.util.logging.ConsoleHandler 
.level= INFO 

Я заметил, что странные вещи происходят, когда я пытаюсь перечислить обработчик на корневом регистратор. Я подозреваю, что это связано с реализацией LogManager, ссылающейся на одно из этих свойств. Тем не менее, я хотел бы попытаться понять, насколько я прав в своем предположении эквивалентности.

Чтобы уточнить: Моя цель с этим вопросом состоит в том, чтобы понять, должно ли поведение быть идентичным.

ответ

5

Причина в том, что существует два разных способа: New Features in J2SE 5.0. В J2SE 1.4 вы можете использовать только add handlers to the root logger, используя свойство handlers.

Per на Java 1.4 LogManager JavaDocs:

свойство "Обработчики". Это определяет список разделенных пробелами списков имен классов для классов обработчиков для загрузки и регистрации в качестве обработчиков в корневом Logger (Logger с именем «»). Каждое имя класса должно быть для класса Handler, у которого есть конструктор по умолчанию. Обратите внимание, что эти Обработчики могут создаваться лениво, когда они сначала используются.

Как вы можете видеть из опубликованного документа JavaDocs, была пересмотрена документация, удаляющая часть, созданную лениво.

В Java 5, JDK-4635817 : Attaching handlers to loggers using logging config file было исправлено допущение использования .handlers В связи с обратной совместимостью LogManager должен был поддерживать как старые, так и новые способы установки обработчиков.

По большей части handlers и .handlers эквивалентны, за исключением:

  1. Использование handlers будет загружать только обработчик, когда LogRecord публикуется обработчиков корневого регистратора. Если вы никогда не регистрируете ничего, обработчик никогда не загружается.
  2. Использование .handlers будет подключить обработчик во время создания корневого регистратора.
  3. Если вы используете оба вместе, то объединение обоих свойств применяются к корневой регистратор, используя правила # 1 и # 2.

Подкласс LogManager, например org.apache.juli.ClassLoaderLogManager, используемый в Tomcat apply different rules from what is listed above.

JDK 9 имеет регресс, который будет зафиксирован, где .handlers не работает правильно. Это подано в соответствии с: JDK-8191033 Regression in logging.properties: specifying .handlers= for root logger (instead of handlers=) no longer works.

+0

Большое вам спасибо! Так что я смог определить это поведение из исходного кода LogManager, но не смог определить причину. Ссылки очень полезны. Хотелось бы, чтобы это было лучше разъяснено в документации. – Uri

1

Просмотрев исходный код LogManager, похоже, что 2 свойства «.handlers» и «handlers» обрабатываются несколько иначе.

Свойство «обработчики», если оно присутствует, приводит к тому, что обработчики корневого регистратора должны быть initialized перед любыми другими обработчиками регистратора. Если вместо этого используется «.handlers», эта инициализация произойдет, но позже, чем ожидает менеджер журнала.

«Странные вещи», которые вы видите, могут быть связаны с этими задержанными обработчиками инициализации.

+0

Вот что я видел при отладке моей локальной версии (от OpenJDK). Тем не менее, я пытаюсь понять, должен ли LogManager обрабатывать как эквивалент. – Uri

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