Ошибка запуска log4j2. Нераспознанный спецификатор преобразования и спецификатор формата

В проекте, использующем 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>

Поделитесь конфигурацией log4j3.

aled 22.06.2024 03:25

Не предоставлено.... Я просмотрел файл jar и обнаружил, что файлов log4j* нет. Исключением является старый файл log4j.dtd (старая висячая зависимость log4j 1.2.x), который я планирую удалить из сборки, но в остальном приложение работает только log4j2.

Valentin Ruano 22.06.2024 04:17

Извините, я ошибся. Какие свойства log4j2.xml или log4j2.properties используются приложением?

aled 22.06.2024 04:19

Все это содержится в файле jar. рабочий каталог не содержит никаких файлов, а домашний каталог пользователя также не содержит файлов конфигурации log4j.

Valentin Ruano 22.06.2024 04:51

Приведите минимально воспроизводимый пример.

aled 22.06.2024 05:34

@aled понимает просьбу, но это один из тех вопросов, которые довольно сложны. Это большая сборка частного коммерческого репозитория, которой мне не разрешено делиться.... Думаю, я прошу указать, откуда может возникнуть эта конфликтующая конфигурация, зная, что у нас отсутствуют файлы конфигурации log4jX. .

Valentin Ruano 22.06.2024 06:13

Я понимаю, но если вы не можете предоставить подробности, то это не лучший вопрос для Stack Overflow. В другом вопросе есть несколько ответов. Вы попробовали их все?

aled 22.06.2024 06:24

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

Stephen C 22.06.2024 12:36

@StephenC — мои компании, поэтому мы — поставщики. Это небольшая ошибка, которую я хотел бы исправить.

Valentin Ruano 22.06.2024 16:44
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
9
101
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Но проблема сохраняется даже после реализации обоих решений, описанных в ответе на этот вопрос.

Эти решения являются взаимоисключающими:

  • удаление Log4j2Plugins.dat заставляет Log4j выполнять трудоемкое сканирование пути к классам пакета org.apache.logging.log4j. Эта функция будет отключена в будущем выпуске.
  • Log4j2PluginCacheFileTransformer, с другой стороны, является подходящим решением, поскольку он объединяет все Log4j2Plugins.dat файлы в один.

Удалите исключение файлов Log4j2Plugins.dat, и ваше приложение должно работать.

Примечание. Из-за ошибки (см. Проблема №87) преобразователь не работает должным образом, если в ваших зависимостях присутствует один файл Log4j2Plugins.dat. Это будет исправлено в версии 0.1.1.

@PiotrPKarwasz спасибо, попробую. Если наличие этого файла .dat в банке настолько полезно, какой инструмент должен генерировать его в среде maven. Спрашиваю на всякий случай, если знаешь это из головы

Valentin Ruano 22.06.2024 16:47

Файл присутствует в log4j-core.jar и каждом JAR-файле, содержащем расширения (например, log4j-layout-template-json.jar). Проблема не в том, как сгенерировать файл, а в том, как правильно объединить два таких файла. Если у вас есть несколько кешей плагинов, и вы просто случайно выбираете файл Log4j2Plugins.dat и отбрасываете остальные (это то, что плагин Maven Shade Plugin делает по умолчанию), вы в конечном итоге потеряете плагины Log4j, в вашем случае DateConverter (ответственный за %d).

Piotr P. Karwasz 22.06.2024 18:21

Я пробовал без исключения, но безуспешно. Попробовав еще несколько вещей, я увидел другой обходной путь, описанный в stackoverflow.com/questions/75996306/…, где вы по сути выбираете Log4j2Plugins.dat из log4j-core и помещаете его в то же место в разделе META-INF.. .. в моем упакованном/закрашенном .jar и все равно не работает!!!! что происходит?

Valentin Ruano 24.06.2024 00:19

На этом этапе идет отладка, и фактически файл .dat читается/анализируется, несмотря на то, что в случае сбоя. Я получил его из log4j-core.jar, поэтому это довольно странно. продолжим отладку.

Valentin Ruano 24.06.2024 05:30

Окончательно! в моем pom в упаковке настроена минимизация jar, которая позволяет избавиться от «неиспользуемых» классов, которые включают в себя несколько, если не все, под org.apache.logging.log4j.core.pattern.*. StatusLogger (log4j «внутренний регистратор» выдает сообщения, указывающие на отсутствующие классы, только на информационном уровне. Если бы он создавал плевковые сообщения при отладке, я бы их увидел.

Valentin Ruano 24.06.2024 07:33
Ответ принят как подходящий

В конце концов я нашел виновника в своем случае, поэтому публикую сообщение на случай, если это поможет кому-то другому; поскольку эти сообщения в большинстве случаев появляются из-за множественного конфликта 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 должна быть возможность явно отказаться).

Другие вопросы по теме