Различные уровни ведения журнала log4j2 для проекта maven с несколькими модулями - PullRequest
0 голосов
/ 27 сентября 2018

У меня есть проект Maven с несколькими различными модулями (модуль ядра и некоторые другие модули, выполняющие различные функции), для которых я хотел бы установить различные уровни ведения журнала, используя log4j2 (например: для модуля ядра, я хотел бы иметь подробныйжурналы (DEBUG), но для других я бы хотел сохранить минимальный набор журналов (INFO).

Вот как выглядит структура проекта:

  project
 +- root
    +- pom.xml
    +- module-core
    |  +- pom.xml
    |  +- src 
    |  |  +- main
    |  |     +- java
    |  |     +- resources
    |  |  +- test
    |  |     +- java
    |  +- target  
    +- module-A
    |  +- pom.xml
    |  +- src
    |  |  +- main
    |  |     +- java
    |  |  +- test
    |  |     +- java
    |  +- target
    +- module-B
    |  +- pom.xml
    |  +- src
    |  |  +- main
    |  |     +- java
    |  |  +- test
    |  |     +- java
    |  +- target

Зависимости Log4j2помещаются в корневой файл pom.xml, а log4j2.xml помещается в module-core в папке ресурсов.

Можно ли настроить и указать нужные уровни ведения журнала в указанном выше файле log4j2.xml?

Вот содержимое log4j2.xml:

<?xml version="1.0" encoding="UTF-8"?>

<properties>
    <property name="filters">org.openqa,org.apache.maven,sun.reflect,java.lang.reflect,java.utils,org.testng</property>
    <property name="logMsgPattern">%highlight{%-5p | %d{HH:mm:ss} |} (%F:%L) %highlight{| %M ||} %m%n%xEx{filters(${filters})}</property>
</properties>

<Appenders>
    <File name="FILE" fileName="target/logs/logfile.log" append="true">
        <PatternLayout pattern="%-5p | %d{HH:mm:ss} | (%F:%L) | %M - %m%n"/>
    </File>

    <Console name="CONSOLE" target="SYSTEM_OUT">
        <PatternLayout pattern="%highlight{%-5p | %d{HH:mm:ss:fff} |} (%F:%L) %highlight{| %M ||} %m%n%xEx{filters(${filters})}"/>
    </Console>

</Appenders>

<Loggers>

    <Root level="INFO" additivity="false">
        <AppenderRef level="INFO" ref="CONSOLE" />
    </Root>

    <Logger name="module-core.*" level="DEBUG" additivity="false">
        <AppenderRef level="DEBUG" ref="CONSOLE" />
    </Logger>

    <Logger name="module-A.*" level="INFO" additivity="false">
        <AppenderRef level="INFO" ref="CONSOLE" />
    </Logger>

</Loggers>

Проблема в том, что Root level="INFO" переопределяет секцию Logger для модуля-ядро и продолжает отображать журналы INFO по всему проекту.

Есть ли способ игнорировать раздел корневого уровня и заставить log4j2 отображать журналы только для моих желаемых разделов в пределахТолько модули?

Спасибо!

1 Ответ

0 голосов
/ 28 сентября 2018

Maven - это инструмент для сборки, а Log4j - это библиотека, которая вступает в игру во время выполнения.

Следовательно, неясно, чего именно вы пытаетесь достичь.

Чтобы получить правильные значенияопределения log4j, его определения (конфигурации) должны появляться в артефакте, и maven «заканчивается», когда артефакт готов (хорошо, есть install и deploy, но они выполняют только «механические» действия над уже подготовленнымартефакт и не меняйте его).

Теперь артефакты можно условно разделить на 2 типа:

  • Приложение, предназначенное для развертывания на сервере (обычно это WARS, EARs, spring-загрузочные приложения и т. д.)
  • Библиотеки, предназначенные для внутреннего использования приложениями вашего проекта или библиотеками, которые должны быть общедоступными (например, сам log4j, hibernate, spring и т. д.)

Обычно только у артефактов первого типа есть определения ведения журнала (log4j2.xml, что угодно).Библиотеки, хотя и могут использовать каркас журналирования, не имеют своих собственных определений, потому что только приложение, которое использует библиотеку, «знает», как «обслуживать» журналы (приложения, шаблоны, которые будут применяться и т. Д.)

Теперь, применяя эти знания к вашему вопросу: я предполагаю, что module-core - это библиотека, а module-a и module-b - приложения.

Если это так, у них должен быть свой собственный файл log4j2.xml впуть к классу во время выполнения .Обычно люди помещают файл конфигурации в src/main/resources этих модулей, и все готово - каждый log4j2.xml может отличаться.Кроме того, они импортируют файл из некоторого «общего» расположения, если цель состоит в том, чтобы сохранить одинаковое поведение log4j (опять же, во время выполнения) между приложениями.

Теперь, сказав все это, maven запустит тесты во времяbuild, и это единственное место, где вы видите, что maven запускает ваш код на самом деле во время сборки .

Тесты в maven имеют другой путь к классу, поэтому, если цель состоит в том, чтобы установить другое поведение log4j в тестах , вы должны поместить конфигурации регистрации в src/test/resources.Ни этот файл, ни сами тесты не будут включены в производственный артефакт.

Эта практика применима как к "библиотекам", так и к "приложениям"

...