В проекте, использующем maven, У меня та же проблема, что описана в log4j2 ОШИБКА StatusLogger Нераспознанный спецификатор преобразования. Но проблема сохраняется даже после реализации обоих решений, описанных в ответе на этот вопрос. то есть исключите Log4jPlugins.dat и используйте плагин преобразователя манифеста для log4j.
Более того, я могу подтвердить, что файл Jar не содержит имени файла Log4j2Plugins.dat ни в META-INF, ни где-либо еще в древовидной структуре jar.
Сообщение об ошибке:
2024-06-22T00:41:49.937Z main ERROR Unrecognized format specifier [d] 2024-06-22T00:41:49.952Z main ERROR Unrecognized conversion specifier [d] starting at position 16 in conversion pattern. 2024-06-22T00:41:49.953Z main ERROR Unrecognized format specifier [thread] 2024-06-22T00:41:49.953Z main ERROR Unrecognized conversion specifier [thread] starting at position 25 in conversion pattern. 2024-06-22T00:41:49.954Z main ERROR Unrecognized format specifier [level] 2024-06-22T00:41:49.954Z main ERROR Unrecognized conversion specifier [level] starting at position 35 in conversion pattern. 2024-06-22T00:41:49.954Z main ERROR Unrecognized format specifier [logger] 2024-06-22T00:41:49.954Z main ERROR Unrecognized conversion specifier [logger] starting at position 47 in conversion pattern. 2024-06-22T00:41:49.955Z main ERROR Unrecognized format specifier [msg] 2024-06-22T00:41:49.955Z main ERROR Unrecognized conversion specifier [msg] starting at position 54 in conversion pattern. 2024-06-22T00:41:49.955Z main ERROR Unrecognized format specifier [n] 2024-06-22T00:41:49.956Z main ERROR Unrecognized conversion specifier [n] starting at position 56 in conversion pattern. 2024-06-22T00:41:49.964Z main ERROR Unrecognized format specifier [d] 2024-06-22T00:41:49.964Z main ERROR Unrecognized conversion specifier [d] starting at position 16 in conversion pattern. 2024-06-22T00:41:49.964Z main ERROR Unrecognized format specifier [thread] 2024-06-22T00:41:49.965Z main ERROR Unrecognized conversion specifier [thread] starting at position 25 in conversion pattern. 2024-06-22T00:41:49.965Z main ERROR Unrecognized format specifier [level] 2024-06-22T00:41:49.965Z main ERROR Unrecognized conversion specifier [level] starting at position 35 in conversion pattern. 2024-06-22T00:41:49.965Z main ERROR Unrecognized format specifier [logger] 2024-06-22T00:41:49.965Z main ERROR Unrecognized conversion specifier [logger] starting at position 47 in conversion pattern. 2024-06-22T00:41:49.965Z main ERROR Unrecognized format specifier [msg] 2024-06-22T00:41:49.965Z main ERROR Unrecognized conversion specifier [msg] starting at position 54 in conversion pattern. 2024-06-22T00:41:49.965Z main ERROR Unrecognized format specifier [n] 2024-06-22T00:41:49.966Z main ERROR Unrecognized conversion specifier [n] starting at position 56 in conversion pattern. 2024-06-22T00:41:51.876Z main ERROR Unrecognized format specifier [p] 2024-06-22T00:41:51.876Z main ERROR Unrecognized conversion specifier [p] starting at position 4 in conversion pattern. 2024-06-22T00:41:51.877Z main ERROR Unrecognized format specifier [d] 2024-06-22T00:41:51.877Z main ERROR Unrecognized conversion specifier [d] starting at position 21 in conversion pattern. 2024-06-22T00:41:51.877Z main ERROR Unrecognized format specifier [C] 2024-06-22T00:41:51.877Z main ERROR Unrecognized conversion specifier [C] starting at position 27 in conversion pattern. 2024-06-22T00:41:51.877Z main ERROR Unrecognized format specifier [m] 2024-06-22T00:41:51.877Z main ERROR Unrecognized conversion specifier [m] starting at position 32 in conversion pattern. 2024-06-22T00:41:51.877Z main ERROR Unrecognized format specifier [n] 2024-06-22T00:41:51.877Z main ERROR Unrecognized conversion specifier [n] starting at position 35 in conversion pattern.
Выдержка из соответствующего maven pom:
plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<dependencies>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-transform-maven-shade-plugin-extensions</artifactId>
<version>0.1.0</version>
</dependency>
</dependencies>
<executions>
<execution>
<id>package-jar</id>
<goals>
<goal>shade</goal>
</goals>
<phase>package</phase>
<configuration>
<minimizeJar>true</minimizeJar>
<createDependencyReducedPom>false</createDependencyReducedPom>
<artifactSet>
<excludes>
<exclude>org.broadinstitute.gatk:gsalib:tar.gz:*</exclude>
<exclude>org.broadinstitute.gatk:*:tar.bz2:example-resources</exclude>
</excludes>
</artifactSet>
<filters>
<filter>
<artifact>*:*</artifact>
<excludes>
<exclude>META-INF/services/javax.annotation.processing.Processor</exclude>
<exclude>**/Log4j2Plugins.dat</exclude>
</excludes>
</filter>
</filters>
<transformers>
<transformer implementation = "org.apache.logging.log4j.maven.plugins.shade.transformer.Log4j2PluginCacheFileTransformer"/>
<transformer implementation = "org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<manifestEntries>
<Multi-Release>true</Multi-Release>
<Main-Class>${app.main.class}</Main-Class>
</manifestEntries>
</transformer>
<transformer implementation = "org.apache.maven.plugins.shade.resource.AppendingTransformer">
<resource>${resource.bundle.path}</resource>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
Не предоставлено.... Я просмотрел файл jar и обнаружил, что файлов log4j* нет. Исключением является старый файл log4j.dtd (старая висячая зависимость log4j 1.2.x), который я планирую удалить из сборки, но в остальном приложение работает только log4j2.
Извините, я ошибся. Какие свойства log4j2.xml или log4j2.properties используются приложением?
Все это содержится в файле jar. рабочий каталог не содержит никаких файлов, а домашний каталог пользователя также не содержит файлов конфигурации log4j.
Приведите минимально воспроизводимый пример.
@aled понимает просьбу, но это один из тех вопросов, которые довольно сложны. Это большая сборка частного коммерческого репозитория, которой мне не разрешено делиться.... Думаю, я прошу указать, откуда может возникнуть эта конфликтующая конфигурация, зная, что у нас отсутствуют файлы конфигурации log4jX. .
Я понимаю, но если вы не можете предоставить подробности, то это не лучший вопрос для Stack Overflow. В другом вопросе есть несколько ответов. Вы попробовали их все?
Кроме того... если это крупное коммерческое приложение, вам следует обратиться к поставщику с вопросами поддержки.
@StephenC — мои компании, поэтому мы — поставщики. Это небольшая ошибка, которую я хотел бы исправить.
Но проблема сохраняется даже после реализации обоих решений, описанных в ответе на этот вопрос.
Эти решения являются взаимоисключающими:
Log4j2Plugins.dat
заставляет Log4j выполнять трудоемкое сканирование пути к классам пакета org.apache.logging.log4j
. Эта функция будет отключена в будущем выпуске.Log4j2Plugins.dat
файлы в один.Удалите исключение файлов Log4j2Plugins.dat
, и ваше приложение должно работать.
Примечание. Из-за ошибки (см. Проблема №87) преобразователь не работает должным образом, если в ваших зависимостях присутствует один файл Log4j2Plugins.dat
. Это будет исправлено в версии 0.1.1
.
@PiotrPKarwasz спасибо, попробую. Если наличие этого файла .dat в банке настолько полезно, какой инструмент должен генерировать его в среде maven. Спрашиваю на всякий случай, если знаешь это из головы
Файл присутствует в log4j-core.jar
и каждом JAR-файле, содержащем расширения (например, log4j-layout-template-json.jar
). Проблема не в том, как сгенерировать файл, а в том, как правильно объединить два таких файла. Если у вас есть несколько кешей плагинов, и вы просто случайно выбираете файл Log4j2Plugins.dat
и отбрасываете остальные (это то, что плагин Maven Shade Plugin делает по умолчанию), вы в конечном итоге потеряете плагины Log4j, в вашем случае DateConverter
(ответственный за %d
).
Я пробовал без исключения, но безуспешно. Попробовав еще несколько вещей, я увидел другой обходной путь, описанный в stackoverflow.com/questions/75996306/…, где вы по сути выбираете Log4j2Plugins.dat из log4j-core и помещаете его в то же место в разделе META-INF.. .. в моем упакованном/закрашенном .jar и все равно не работает!!!! что происходит?
На этом этапе идет отладка, и фактически файл .dat читается/анализируется, несмотря на то, что в случае сбоя. Я получил его из log4j-core.jar, поэтому это довольно странно. продолжим отладку.
Окончательно! в моем pom в упаковке настроена минимизация jar, которая позволяет избавиться от «неиспользуемых» классов, которые включают в себя несколько, если не все, под org.apache.logging.log4j.core.pattern.*
. StatusLogger (log4j «внутренний регистратор» выдает сообщения, указывающие на отсутствующие классы, только на информационном уровне. Если бы он создавал плевковые сообщения при отладке, я бы их увидел.
В конце концов я нашел виновника в своем случае, поэтому публикую сообщение на случай, если это поможет кому-то другому; поскольку эти сообщения в большинстве случаев появляются из-за множественного конфликта Log4j2Plugins.dat
с участием maven или без него, трудно решить возможные альтернативные проблемы, которые вызывают появление сообщений об ошибках.
В моем случае проблема заключалась в том, что в нашей сборке была включена дополнительная функция минимизации jar из maven-shade-plugin
:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.4.1</version>
<executions>
<execution>
<id>package-jar</id>
<goals>
<goal>shade</goal>
</goals>
<phase>none</phase>
<configuration>
<minimizeJar>true</minimizeJar>
<!-- ... -->
</configuration>
</exectuion>
</executions>
</plugin>
Замените true
выше на false
— это все, что нужно.
Это привело к тому, что многие классы, на которые нет явных ссылок в коде, были исключены из jar, включая классы под org.apache.logging.log4j.core.pattern.**
. Таким образом, поддерживающие подключение/шаблон core
не были загружены, что привело к появлению сообщений об ошибках инициализации.
Регистратор log4j-core (StatusLogger
) выводил INFO-сообщения, когда на такие плагины ссылались в Log4j2Plugins.dat
, что по умолчанию в моем случае не выводится, тем самым замалчивая причину проблемы. Думаю, я мог бы избежать траты столько времени, сколько я потратил на это, если бы изменил уровень вывода StatusLogger, но, возможно, ПРЕДУПРЕЖДЕНИЕ, а не ИНФОРМАЦИЯ, имеет больше смысла (в этом случае у минимизаторов jar должна быть возможность явно отказаться).
Поделитесь конфигурацией log4j3.