Почему они должны быть в иерархии ...?
Наследование. Per Обзор ведения журнала Java ™ - 1.3 Регистраторы :
В частности, регистратор может наследовать:
уровень ведения журнала. Если для уровня Logger установлено значение NULL, то Logger будет использовать эффективный уровень, который будет получен путем перехода вверх по родительскому дереву и использования первого ненулевого уровня. Обработчики. По умолчанию Logger будет регистрировать любые выходные сообщения для своих родительских обработчиков и так далее рекурсивно вверх по дереву. Имена пакетов ресурсов. Если регистратор имеет нулевое имя пакета ресурсов, он наследует любое имя пакета ресурсов, определенное для его родителя, и так далее рекурсивно вверх по дереву.
Использование замедления пакета в Java, что позволяет вы можете прослушивать, отключать или отсеивать журналы для класса, пакета или даже сторонней библиотеки организации. Это также означает, что вам не нужно писать файл конфигурации с сотнями имен регистраторов, чтобы отключить все журналы. Установка root выравнивает всех дочерних элементов для вас в одну строку. Поскольку у вас есть древовидная структура, вы можете рекурсивно применить этот logi c к дочерним регистраторам, чтобы отключить определенную c библиотеку или логический программный модуль.
В учебнике это объясняется:
Logger.getLogger("com.jenkov.web")
имеет только одного родителя - регистратора root. Выглядит это так: "" <- "com.jenkov.web"
Однако Logger logger = Logger.getLogger("");
Logger logger1 = Logger.getLogger("com");
Logger logger2 = Logger.getLogger("com.jenkov");
Logger logger3 = Logger.getLogger("com.jenkov.web");
заставляет LogManager создавать другую иерархию, которая выглядит так: "" <- "com." <- "com.jenkov." <- "com.jenkov.web"
Добавление кода, подобного этому не требуется в log4j, но требуется в JUL, если вы хотите изменить иерархию, чтобы вы могли контролировать ее во время выполнения . Также логгеры должны быть закреплены в памяти, чтобы избежать сборки мусора , если вам нужно проделать этот трюк.
... в чем преимущество сворачивания сообщений?
Я так понимаю, вы имеете в виду отправку сообщений родительским регистраторам ??? Это позволяет конфигурации отсеивать записи журнала в определенные c обработчики и совместно использовать общие настройки обработчика. Например, в конфигурации среды разработки вы можете захотеть отправить весь вывод на консоль, подключившись к root, а затем отправить в FileHandler только для определенного пакета c. Преимущество дерева регистратора в том, что вам не нужно присоединять второй ConsoleHandler к указанному пакету c, чтобы увидеть вывод консоли.