Использование log4j json-event-layout с Karaf 3.0.5 под управлением servicemix

Я пытаюсь использовать JSONEventLayoutV1 в качестве макета шаблона для ведения журнала karaf для регистрации всех событий в json. формат.

Шаги, которые я выполнил.

  1. Изменил файл pom.xml jsonevent-layout, как показано ниже: -

    <plugin>
    <groupId>org.apache.felix</groupId>
    <artifactId>maven-bundle-plugin</artifactId>
    <version>2.3.7</version>
    <extensions>true</extensions>
    <configuration>
        <instructions>
            <Bundle-Name>${project.groupId}.${project.artifactId}</Bundle-Name>
            <Bundle-SymbolicName>${project.groupId}.${project.artifactId}</Bundle-SymbolicName>
            <Import-Package>*;resolution:=optional</Import-Package>
            <Export-Package>*</Export-Package>
            <Fragment-Host>org.ops4j.pax.logging.pax-logging-service;bundle-version="[1.6,1.7)"</Fragment-Host>
            <Embed-Dependency>*;scope=compile|runtime;inline=true</Embed-Dependency>
            <Implementation-Version>${project.version}</Implementation-Version>
        </instructions>
    </configuration>
    

    </plugin>

  2. Создайте формат json, используя mvn clean install -Pbundle

  3. Скопируйте созданный пакет в системный каталог

    mkdir -p ${karaf.home}/system/net/logstash/log4j/jsonevent-layout/1.8-SNAPSHOT/    
    cp target/jsonevent-layout-1.8-SNAPSHOT.jar ${karaf.home}/system/net/logstash/log4j/jsonevent-layout/1.8-SNAPSHOT/
    
  4. Добавьте эту строку в etc/startup.properties перед Pax Logging net/logstash/log4j/jsonevent-layout/1.8-SNAPSHOT/jsonevent-layout-1.8-SNAPSHOT.jar=3 mvn\:org.ops4j.pax.url/pax-url-aether/2.4.1 = 5 mvn\:org.ops4j.pax.url/pax-url-wrap/2.4.1/jar/uber = 5 mvn\:org.ops4j.pax.logging/pax-logging-api/1.8.4 = 8 mvn\:org.ops4j.pax.logging/pax-logging-service/1.8.4 = 8
  5. Обновлено org.ops4j.pax.logging.cfg следующим образом: - log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=net.logstash.log4j.JSONEventLayoutV1 log4j.appender.stdout.layout.ConversionPattern=%d{ISO8601} | %-5.5p | %-16.16t | %-32.32c{1} | %X{bundle.id} - %X{bundle.name} - %X{bundle.version} | %m%n

Но всякий раз, когда я запускаю Karaf, я получаю следующее исключение: -

jabong@jabong1143:~/Downloads/software/dev/apache-servicemix-6.1.0$ sudo bin/servicemix
Please wait while Apache ServiceMix is starting...
 21% [===============>                                                        ]log4j:ERROR Could not instantiate class [net.logstash.log4j.JSONEventLayoutV1].
java.lang.ClassNotFoundException: net.logstash.log4j.JSONEventLayoutV1 not found by org.ops4j.pax.logging.pax-logging-service [5]
    at org.apache.felix.framework.BundleWiringImpl.findClassOrResourceByDelegation(BundleWiringImpl.java:1532)
    at org.apache.felix.framework.BundleWiringImpl.access$400(BundleWiringImpl.java:75)
    at org.apache.felix.framework.BundleWiringImpl$BundleClassLoader.loadClass(BundleWiringImpl.java:1955)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:264)
    at org.apache.log4j.helpers.Loader.loadClass(Loader.java:198)
    at org.apache.log4j.helpers.OptionConverter.instantiateByClassName(OptionConverter.java:326)
    at org.apache.log4j.helpers.OptionConverter.instantiateByKey(OptionConverter.java:123)
    at org.apache.log4j.PaxLoggingConfigurator.parseAppender(PaxLoggingConfigurator.java:129)
    at org.apache.log4j.PropertyConfigurator.parseCategory(PropertyConfigurator.java:735)
    at org.apache.log4j.PropertyConfigurator.configureRootCategory(PropertyConfigurator.java:615)
    at org.apache.log4j.PropertyConfigurator.doConfigure(PropertyConfigurator.java:502)
    at org.apache.log4j.PaxLoggingConfigurator.doConfigure(PaxLoggingConfigurator.java:72)
    at org.ops4j.pax.logging.service.internal.PaxLoggingServiceImpl.updated(PaxLoggingServiceImpl.java:214)
    at org.ops4j.pax.logging.service.internal.PaxLoggingServiceImpl$1ManagedPaxLoggingService.updated(PaxLoggingServiceImpl.java:362)
    at org.apache.felix.cm.impl.helper.ManagedServiceTracker.updated(ManagedServiceTracker.java:189)
    at org.apache.felix.cm.impl.helper.ManagedServiceTracker.updateService(ManagedServiceTracker.java:152)
    at org.apache.felix.cm.impl.helper.ManagedServiceTracker.provideConfiguration(ManagedServiceTracker.java:85)
    at org.apache.felix.cm.impl.ConfigurationManager$UpdateConfiguration.run(ConfigurationManager.java:1747)
    at org.apache.felix.cm.impl.UpdateThread.run(UpdateThread.java:103)
    at java.lang.Thread.run(Thread.java:745)
log4j:ERROR No layout set for the appender named [out].
100% [========================================================================]

Может ли кто-нибудь сообщить мне, что я делаю неправильно?

Эта проблема также обсуждалась на форуме пользователей Karaf< /а>. Но все равно не повезло.


person tuk    schedule 27.02.2016    source источник
comment
проверьте свои пакеты импорта/экспорта для этого класса/пакета.   -  person Achim Nierbeck    schedule 29.02.2016
comment
@AchimNierbeck - я добавил <Import-Package>*;resolution:=optional</Import-Package> и <Export-Package>*</Export-Package> в pom.xml. Но все равно получаю ту же ошибку. Также обновил мой pom.xml в вопросе.   -  person tuk    schedule 29.02.2016
comment
поскольку вы уже разместили это в списке рассылки karaf, сохраните сообщение там.   -  person Achim Nierbeck    schedule 29.02.2016


Ответы (1)


Фрагментарный подход верен для простого log4j. Не уверен, что это также работает для регистрации pax. Подход, который работает, состоит в том, чтобы предложить сервис приложения для регистрации pax и обернуть в него вышеприведенный модуль. См. этот код из декантера karaf в качестве примера.

В зависимости от того, чего вы хотите достичь, может быть даже проще просто использовать декантер apache karaf. Он может захватывать сообщения журнала jmx и системную информацию и подталкивать их среди прочего к эластичному поиску.

person Christian Schneider    schedule 27.02.2016
comment
Я просто пытаюсь заставить karaf регистрировать все сообщения в формате json. Поэтому для этого я попытался использовать JSONEventLayout. Не могли бы вы сообщить мне, как я могу добиться того же? - person tuk; 27.02.2016
comment
В графине в настоящее время нет приложения для формата json. Но вы можете реализовать org.ops4j.pax.logging.spi.PaxAppender и опубликовать его как услугу. Внутри вы можете затем передать json appender. - person Christian Schneider; 27.02.2016
comment
Фрагментарный подход — это один из способов добавления пользовательских приложений к Pax-Logging. Проблема здесь больше похожа на правильную проблему с импортом пакета - person Achim Nierbeck; 29.02.2016