2014-12-08 3 views
5

Я работаю над проектом, в котором я использую log4j2. при разработке в intellij, все работает нормально, и ведение журнала выполняется, как ожидалось. log4j2.xml связан через свойство java, переданное jvm при запуске через intellij настройки. но когда я пытаюсь запустить автономные Gradle встроенного жира-банку, я испытываю следующие проблемы:Не удалось загрузить log4j2 во время работы fatjar

java -Dlog4j.debug=true -Dlog4j.configurationFile=/home/aaa/log4j2.xml -jar /home/aaa/myjar-SNAPSHOT.jar 

исключение:

ERROR StatusLogger Unrecognized format specifier [d] 
ERROR StatusLogger Unrecognized conversion specifier [d] starting at position 16 in conversion pattern. 
ERROR StatusLogger Unrecognized format specifier [thread] 
ERROR StatusLogger Unrecognized conversion specifier [thread] starting at position 25 in conversion pattern. 
... 
ERROR StatusLogger No log4j2 configuration file found. Using default configuration: logging only errors to the console. 

я даже не понимаю, где та [нить] ы пришли, так как я получаю ту же ошибку, даже при использовании основной простейшей конфигурации в моем log4j2:

<?xml version="1.0" encoding="UTF-8" ?><Configuration status="WARN" monitorInterval="86400"> 
<Appenders> 
    <Console name="console-log" target="SYSTEM_OUT"> 
     <PatternLayout 
       pattern="%-5p %d{yyyy-MM-dd HH:mm:ss.SSS} ${hostName} %c{1} %msg %throwable{7}%n"/> 
    </Console> 
</Appenders> 
<Loggers> 
    <Root level="info" additivity="false"> 
     <AppenderRef ref="console-log"/> 
    </Root> 
</Loggers> 

любые мысли приветствуются. Благодарю.

+0

нормально, проблема заключается в том, что log4j2-лотковый Appender не работает при упакованы в FatJar (ошибки приведены выше). в стандартной среде с несколькими jar-файлами, поддерживающей класс, все работает нормально. любые мысли о том, как решить эту проблему для fatjars? – atarno

+0

Кто-нибудь нашел решение? – Quintium

+1

nope, мы переехали работать с главным банком и библиотекой банок вместо жирной банки в этом проекте. – atarno

ответ

1

в FatJar, зависимостей может обеспечить log4j-provider.properties в META-INF, которые вызывают эту проблему,

удалить его в Gradle задачи:

task fatJar(type: Jar) { 
    manifest { 
     attributes 'Implementation-Title': 'project', 
     'Implementation-Version': project.version, 
     'Main-Class': 'com.sample.CLI' 
    } 
    baseName = project.name + '-all' 
    from { 
     configurations.compile.collect { 
      it.isDirectory() ? it : zipTree(it).matching { 
       exclude 'META-INF/**.RSA' 
       exclude 'META-INF/MANIFEST.MF' 
       exclude 'META-INF/log4j-provider.properties' 
      } } } 
    with jar 
} 
1

Проблема описана здесь: https://issues.apache.org/jira/browse/LOG4J2-673

к сожалению, на данный момент там только кажется решением для Maven-тени-плагин: https://github.com/edwgiz/maven-shaded-log4j-transformer

<plugins> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-shade-plugin</artifactId> 
      <version>2.4.3</version> 
      <executions> 
       <execution> 
        <phase>package</phase> 
        <goals> 
         <goal>shade</goal> 
        </goals> 
        <configuration> 
         <finalName>${project.artifactId}${appSuffix}</finalName> 
         <transformers> 
... 
          <transformer 
            implementation="com.github.edwgiz.mavenShadePlugin.log4j2CacheTransformer.PluginsCacheFileTransformer"> 
          </transformer> 
         </transformers> 
... 
        </configuration> 
       </execution> 
      </executions> 
      <dependencies> 
       <dependency> 
        <groupId>com.github.edwgiz</groupId> 
        <artifactId>maven-shade-plugin.log4j2-cachefile-transformer</artifactId> 
        <version>2.1</version> 
       </dependency> 
      </dependencies> 
     </plugin> 
</plugins> 
1

LoggerContextFactory связывает API Log4j с его реализацией. Log4j LogManager находит LoggerContextFactory путем поиска всех экземпляров META-INF/log4j-provider.properties, стандартного файла java.util.Properties, а затем проверки каждого, чтобы убедиться, что он указывает значение для свойства Log4jAPIVersion, которое соответствует версии, требуемой LogManager.

Incase жира банку, вы можете явно указать log4j2 использовать LoggerContextFactory в вашем приложении:

System.setProperty("log4j2.loggerContextFactory", "org.apache.logging.log4j.core.impl.Log4jContextFactory") 

или как указано в файле log4j-provider.properties включены в log4j-core банку.

0

Когда вы запускаете приложение из среды IDE, jar запускается без встраивания зависимостей, и у вас нет конфликтов настроек журнала. Но когда вы конвертируете приложение в жирную банку, тогда все зависимости будут вставляться в файл jar вашего проекта, а ваши параметры log4j, которые поступают из внешних файлов jar (зависимостей), могут быть конфликтующими, в то время как процесс fatJar объединяет их в один артефакт.

В этом случае я думаю, что ваши файлы «Log4j2Plugins.dat» могут быть конфликтующими. Разумеется, вы можете открыть файл fatJar с помощью zip-редактора (например: 7Zip), перейдите по пути в fatJar, как показано ниже, и удалите один из конфликтующих файлов (вы можете выбрать самый маленький по размеру) из вашего fatJar. Запустите fatJar и проверьте правильность работы журнала.

\ META-INF \ org \ apache \ logging \ log4j \ core \ config \ plugins \ Log4j2Plugins.dat

Теперь мы можем проверить зависимости (артефакты) и найти, какие из них содержат файлы Log4j2Plugins.dat. Таким образом, вы можете исключить модули, у которых есть файл из вашего инструмента сборки, а затем процесс создания fatJar будет исключать конфликтующие файлы, и ваш новый fatJar может начать регистрацию, как и ожидалось.

В моем случае модуль fatJar импортирует некоторые другие модули из Spring Boot, и когда я исключаю конфликтующие библиотеки протоколирования, мой fatJar запускает ведение журнала без каких-либо ошибок.

configurations { all*.exclude module: 'spring-boot' all*.exclude module: 'spring-boot-starter-logging' all*.exclude module: 'logback-classic' all*.exclude module: 'commons-logging' }

 Смежные вопросы

  • Нет связанных вопросов^_^