Отсутствие возможности регистрации Karaf 4.2.6 с использованием log4j2 с JsonLayout для типа макета

Я занимался этим весь день и не смог заставить его работать после того, как попробовал так много комбинаций. В конце концов, я ищу явный список шагов для получения журнала JSON от Karaf. Я даже просмотрел исходный код плагина Maven Karaf, пытаясь разобраться в этом, хотя, возможно, я не смотрел достаточно далеко.

Я использую Karaf 4.2.6. Я пытаюсь создать развертывание Karaf, используя karaf-maven-plugin, версия 4.2.6.

Если я изменю layout.type для различных приложений к JsonLayout, Я получаю трассировку стека, в которой говорится, что он не может загрузить макет JSON, потому что мне не хватает класса. java.lang.NoClassDefFoundError: com/fasterxml/jackson/databind/ser/FilterProvider.

Я посмотрел на банку org.ops4j.pax.logging/pax-logging-log4j2/1.10.2 и обнаружил, что мне нужны 3 баночки Джексона, Core v2.8.7, Annotations v2.8.0 и Databind v2.8.7.

Я пытался поместить эти файлы в etc/startup.properties либо с начальным уровнем 5, либо с начальным уровнем 8, чтобы они были готовы к org.ops4j.pax.logging/pax-logging-log4j2/1.10.2когда он начнется. Я убедился, что они были вsystemпапку в нужном месте. В большинстве случаев, если бы я ихetc/startup.properties, у них был начальный уровень 30. Я поместил их в объект с правильными начальными уровнями, но они либо запускались хорошо после того, что использовали startup.propertiesили просто так и не появился. Я пробовал много возможных комбинаций,startupBundles, startupFeatures, bootFeatures, но ничего не получилось startup.properties. Я не мог понять, как содержимоеstartup.propertiesсгенерировано. Иногда функции, которые я хотел для своего приложения, даже не запускались, потому что что-то в конфигурации было заблокировано при настройке ведения журнала, если я просто поместил ссылки на эти jar-файлы вstartup.properties, например

mvn\:com.fasterxml.jackson.core/jackson-core/2.8.7 = 5

Ниже мой pom.xml с некоторыми комментариями из предыдущих попыток:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <properties>
      <my_version>0.0.0</my_version>
      <myapp_common_version>0.0.0</myapp_common_version>
    </properties>    

    <groupId>com.me.myapp</groupId>
    <artifactId>myapp-karaf</artifactId>
    <version>${my_version}</version>
    <packaging>karaf-assembly</packaging>

    <name>myapp-karaf</name>
    <description>myapp-karaf details</description>

    <repositories>
        <!-- Apache ServiceMix repository (for region) -->
        <repository>
            <id>apache.servicemix.m2</id>
            <name>Apache ServiceMix M2 repository</name>
            <url>http://svn.apache.org/repos/asf/servicemix/m2-repo</url>
            <releases>
                <enabled>true</enabled>
            </releases>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </repository>
        <!-- OPS4J SNAPSHOT repository -->
        <repository>
            <id>ops4j.sonatype.snapshots.deploy</id>
            <name>OPS4J snapshot repository</name>
            <url>https://oss.sonatype.org/content/repositories/ops4j-snapshots/</url>
            <releases>
                <enabled>false</enabled>
            </releases>
            <snapshots>
                <enabled>true</enabled>
            </snapshots>
        </repository>
        <!-- Apache SNAPSHOT -->
        <repository>
            <id>apache.snapshots.deploy</id>
            <name>Apache snapshot repository</name>
            <url>https://repository.apache.org/content/groups/snapshots-group</url>
            <releases>
                <enabled>false</enabled>
            </releases>
            <snapshots>
                <enabled>true</enabled>
            </snapshots>
        </repository>
    </repositories>

    <dependencies>
        <dependency>
            <groupId>org.apache.karaf.features</groupId>
            <artifactId>framework</artifactId>
            <version>4.2.6</version>
            <type>kar</type>
        </dependency>
        <dependency>
            <groupId>org.apache.karaf.features</groupId>
            <artifactId>standard</artifactId>
            <version>4.2.6</version>
            <classifier>features</classifier>
            <type>xml</type>
        </dependency>
        <dependency>
            <groupId>org.apache.karaf.features</groupId>
            <artifactId>spring</artifactId>
            <version>4.2.6</version>
            <classifier>features</classifier>
            <type>xml</type>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.apache.karaf.features</groupId>
            <artifactId>enterprise</artifactId>
            <version>4.2.6</version>
            <classifier>features</classifier>
            <type>xml</type>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>com.me.myapp</groupId>
            <artifactId>myapp-common-feature</artifactId>
            <version>${myapp_common_version}</version>
            <classifier>features</classifier>
            <type>xml</type>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>com.me.myapp</groupId>
            <artifactId>myapp-feature</artifactId>
            <!-- Annoyingly this cannot come from an environment variable -->
            <version>${my_version}</version>
            <classifier>features</classifier>
            <type>xml</type>
            <scope>runtime</scope>
        </dependency>
    </dependencies>

    <build>
        <resources>
            <resource>
                <directory>${env.MYAPP_SOURCE_HOME}/myapp-common/server/karaf/assembly</directory>
                <filtering>false</filtering>
                <includes>
                    <include>**/*</include>
                </includes>
            </resource>
            <resource>
                <directory>src/main/resources</directory>
                <filtering>false</filtering>
                <includes>
                    <include>**/*</include>
                </includes>
            </resource>
            <resource>
                <directory>src/main/filtered-resources</directory>
                <filtering>true</filtering>
                <includes>
                    <include>**/*</include>
                </includes>
            </resource>
        </resources>
        <pluginManagement>
            <plugins>
                <plugin>
                    <groupId>org.apache.karaf.tooling</groupId>
                    <artifactId>karaf-maven-plugin</artifactId>
                    <version>4.2.6</version>
                    <extensions>true</extensions>
                </plugin>
            </plugins>
        </pluginManagement>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-resources-plugin</artifactId>
                <version>2.6</version>
                <executions>
                    <execution>
                        <id>process-resources</id>
                        <goals>
                            <goal>resources</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>org.apache.karaf.tooling</groupId>
                <artifactId>karaf-maven-plugin</artifactId>
                <configuration>
                    <startupBundles> <!--
                        <bundle>mvn:com.fasterxml.jackson.core/jackson-annotations/2.8.0</bundle>
                        <bundle>mvn:com.fasterxml.jackson.core/jackson-core/2.8.7</bundle>
                        <bundle>mvn:com.fasterxml.jackson.core/jackson-databind/2.8.7</bundle> -->
                    </startupBundles>
                    <installedFeatures>
                    </installedFeatures>
                    <startupFeatures>
                        <feature>com.me.myapp/${my_version}</feature>
                    </startupFeatures>
                    <bootFeatures>
                        <feature>com.me.myapp.logging.provider/${myapp_common_version}</feature>
                        <!-- standard distribution -->
                        <!-- <feature>standard</feature> -->
                        <!-- minimal distribution -->
                        <!--<feature>minimal</feature>-->
                        <feature>jaas</feature>
                        <feature>shell</feature>
                        <feature>ssh</feature>
                        <feature>management</feature>
                        <feature>bundle</feature>
                        <feature>config</feature>
                        <feature>deployer</feature>
                        <feature>diagnostic</feature>
                        <feature>instance</feature>
                        <feature>kar</feature>
                        <feature>wrap</feature>
                        <feature>log</feature>
                        <feature>package</feature>
                        <feature>service</feature>
                        <feature>system</feature>

                    </bootFeatures>
                    <javase>1.8</javase>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

com.me.myapp.logging.provider содержит банки Джексона с надлежащим начальным уровнем.

Я запускаю свои контейнеры в Kubernetes и хочу, чтобы стандартный сбор журналов в Kubernetes работал. Я использую дополнительный плагин для сборщика журналов, чтобы, по крайней мере, несколько разделить вещи в формате JSON, но он подвержен ошибкам, и я бы предпочел просто начать с журналов в формате JSON, а не обрабатывать их позже, чтобы я мог разделить компоненты log, например лицо, выполнившее операцию, во время регистрации.

Я искал в stackru, искал в Google и нашел подсказки, но никаких явных шагов, которые привели бы к решению, не было. Я понимаю, что здесь нет явного списка файлов, но, как я уже сказал, я перебрал множество комбинаций. Любая помощь приветствуется. Я также буду размещать сообщения в группе пользователей Karaf.

3 ответа

Хорошо, через несколько дней я понял все, что нужно было сделать. Спасибо @GrzegorzGrzybek за помощь.

Мне понадобились следующие строчки

mvn\:org.ops4j.pax.logging/pax-logging-log4j2-extra/1.11.4 = 8
mvn\:com.fasterxml.jackson.core/jackson-core/2.9.10 = 8
mvn\:com.fasterxml.jackson.core/jackson-annotations/2.9.10 = 8
mvn\:com.fasterxml.jackson.core/jackson-databind/2.9.10 = 8

добавлен в мой etc/startup.properties. Если бы я просто отредактировал файл, чтобы добавить их, и убедился, что у меня есть файлы вsystemрепозиторий, это не сработает. Понятия не имею, какая-то запись не была сделана где-то еще вetc конфигураций, поэтому либо контейнер не запускался, либо некоторые наборы функций запускались до wrap был установлен обработчик, поэтому весь контейнер останавливался.

Я перепробовал множество комбинаций, но наконец нашел, как etc/startup.properties. Я поместил нужные пакеты в отдельную функцию с начальным уровнем, который я хотел, чтобы они имели.

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<features xmlns="http://karaf.apache.org/xmlns/features/v1.3.0" name="myapp-common-container-feature">
  <feature name="com.me.myapp.logging.provider" version="0.12.0" description="MyApp Logging Provider">
    <bundle start-level="8">mvn:com.fasterxml.jackson.core/jackson-annotations/2.9.10</bundle>
    <bundle start-level="8">mvn:com.fasterxml.jackson.core/jackson-core/2.9.10</bundle>
    <bundle start-level="8">mvn:com.fasterxml.jackson.core/jackson-databind/2.9.10</bundle>
    <bundle start-level="8">mvn:org.ops4j.pax.logging/pax-logging-log4j2-extra/1.11.4</bundle>
  </feature>
</features>

Обратите внимание на start-level атрибут.

Затем в своей сборке POM я помещаю следующую зависимость:

        <dependency>
            <groupId>com.me.myapp</groupId>
            <artifactId>myapp-common-container-feature</artifactId>
            <version>0.12.0</version>
            <classifier>features</classifier>
            <type>xml</type>
            <scope>compile</scope>
        </dependency>

Важная линия здесь <scope>compile</scope>. Особенности вcompile объем будет помещен в startup.properties если поместить в <startupFeatures /> в конфигурации для плагина Karaf Maven.

            <plugin>
                <groupId>org.apache.karaf.tooling</groupId>
                <artifactId>karaf-maven-plugin</artifactId>
                <configuration>
                  <startupFeatures>                
                    <feature>com.me.myapp.logging.provider/0.12.0</feature>
                  </startupFeatures>

Теперь контейнер запускается с ведением журнала JSON.

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

Вот что я сделал:

Добавлен дополнительный log4j2 с тремя библиотеками Jackson (версия 1.11.13 Pax-Logging + версия jackson 2.12.4) в startup.properties:

      mvn\:com.fasterxml.jackson.core/jackson-annotations/2.12.4 = 6
mvn\:com.fasterxml.jackson.core/jackson-core/2.12.4 = 6
mvn\:com.fasterxml.jackson.core/jackson-databind/2.12.4 = 6
mvn\:org.ops4j.pax.logging/pax-logging-log4j2-extra/1.11.13 = 6
mvn\:org.ops4j.pax.logging/pax-logging-api/1.11.13 = 8
mvn\:org.ops4j.pax.logging/pax-logging-log4j2/1.11.13 = 8

И в overrides.properties:

      mvn:com.fasterxml.jackson.core/jackson-core/2.12.4;range="[2,3)"
mvn:com.fasterxml.jackson.core/jackson-databind/2.12.4;range="[2,3)"
mvn:com.fasterxml.jackson.core/jackson-annotations/2.12.4;range="[2,3)"

и только после этого я смог увидеть правильно отформатированный журнал Json (с JsonLayoutустаревший способ).

Я также попробовал новый способ, пытаясь развернуть пакет log4j-layout-template-jsonно кажется, что эта библиотека выпущена неправильно (фрагмент хоста относится к самому себе).

Я поместил эти баночки в системный репозиторий, установил с помощью обертки и перезапустил karaf. У меня сработало:

      bundle:install 'wrap:mvn:org.ops4j.pax.logging/pax-logging-log4j2-extra/1.11.4'
bundle:install 'wrap:mvn:com.fasterxml.jackson.core/jackson-core/2.9.10'
bundle:install 'wrap:mvn:com.fasterxml.jackson.core/jackson-annotations/2.9.10'
bundle:install 'wrap:mvn:com.fasterxml.jackson.core/jackson-databind/2.9.10'
Другие вопросы по тегам