Если я понимаю, о чем вы спрашиваете, у вас есть понятие «компонент», который пересекает пакеты Java, и вы хотите обрабатывать настройку уровня ведения журнала на основе того, в каком компоненте он находится, а не обязательно на какомпакет, в котором он находится. Я вижу несколько подходов, которые можно использовать.
В то время как стандарт имени регистратора основан на имени класса (и, следовательно, пакета Java, в котором находится класс),вам не нужно , чтобы использовать это для имен ваших регистраторов.То есть у вас может быть иерархия логгера, которая отличается от иерархии вашего пакета.В вашем классе com.a.b.c.xyz
вы можете получить регистратор с:
final Logger logger = LoggerFactory.getLogger("com.a.b.xyz.c");
В вашем классе com.a.b.d.core.xyz
получить регистратор с:
final Logger logger = LoggerFactory.getLogger("com.a.b.xyz.d.core");
И тогда вы можете простоиспользуйте обычные определения уровня ведения журнала, установив уровень ведения журнала для com.a.b.xyz
, чтобы получить все средства ведения журнала под этим компонентом.Это немного нетрадиционно, и может запутать разработчиков, плохо знакомых с вашим проектом, но если вы действительно хотите, чтобы иерархия журналирования и иерархия пакетов были разными, это то, что вы можете сделать.
ДругойПодход заключается в том, чтобы оставить иерархию имен журналирования как есть, но использовать механизм SLF4J / Logback Marker , чтобы «пометить» каждое сообщение журнала для каждого компонента.
final Logger logger = LoggerFactory.getLogger(getClass());
final Marker xyzComponent = MarkerFactory.getMarker("XYZ");
…
logger.info(xyzComponent, "A log message");
Затем вы можете настроить Фильтры в Logback на основе искомых маркеров.Это требует, чтобы вы были последовательны и удостоверились, что каждое сообщение, о котором вы заботитесь, помечено соответствующим маркером, но это самая близкая вещь к «супер логгеру» или «групповому логгеру», который есть в архитектуре SLF4J.Механизм маркеров действительно мощный и позволяет вам делать с ним практически все, если ваши сообщения имеют правильный маркер и вы настраиваете свою конфигурацию ведения журнала так, чтобы фильтровать только сообщения с правильным фильтром.
Другой подход, который я могу придумать, заключается в том, чтобы в основном продолжать делать то, что вы делаете сейчас, и указывать множество отдельных регистраторов на уровне отладки, но иметь эту «отладочную» запись в журналНастройки конфигурации для каждого компонента в отдельных файлах.Затем, когда вам нужно отладить компонент, вам просто нужно добавить (или раскомментировать?) Соответствующий элемент include в ваших основных настройках ведения журнала.
В файле xyz-debug.xml:
<included>
<logger name="com.a.b.c.xyz" level="debug" />
<logger name="com.a.b.d.core.xyz" level="debug" />
<logger name="com.a.b.e.xyz" level="debug" />
<logger name="com.a.b.e.f.xyz" level="debug" />
<logger name="com.a.b.t.services.xyz" level="debug" />
</included>
В файле abc-debug.xml:
<included>
<logger name="com.a.b.c.abc" level="debug" />
<logger name="com.a.b.d.core.abc" level="debug" />
<logger name="com.a.b.e.abc" level="debug" />
<logger name="com.a.b.e.f.abc" level="debug" />
<logger name="com.a.b.t.services.abc" level="debug" />
</included>
А затем в вашем основном logback.xml:
<!--<include file="xyz-debug.xml"/>-->
<!--<include file="abc-debug.xml"/>-->
И вы просто раскомментируете соответствующиестрока, когда вам нужно отладить этот компонент.Возможно, немного сложновато и упрощенно, и может быть очень запутанно, если кто-то забудет обновить xyz-debug.xml, когда компонент xyz является частью нового пакета, но я могу себе представить, что это работает достаточно хорошо для некоторых команд.Также не требуется никаких изменений кода, что может быть плюсом.