0

I am trying to use JSONEventLayoutV1 as the pattern layout for karaf logging to log all events in json format.

The steps that I have followed.

  1. Modified the pom.xml file of jsonevent-layout as shown below:-

    <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. Build json format using mvn clean install -Pbundle

  3. Copy bundle created to system directory

    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. Add this line to etc/startup.properties before 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. Updated org.ops4j.pax.logging.cfg as follows:- 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

But whenever I am starting Karaf I am getting the below exception:-

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% [========================================================================]

Can some one let me know what I am doing wrong?

The issue has also been discussed in Karaf User Forum. But still no luck.

рüффп
  • 5,172
  • 34
  • 67
  • 113
tuk
  • 5,941
  • 14
  • 79
  • 162

1 Answers1

1

The fragement approach is correct for plain log4j. Not sure if it also works for pax-logging. An approach that works is to offer a pax logging appender service and wrap the above appender in it. See this code from karaf decanter as an example.

Depending on what you want to achieve it might be even easier to simply use apache karaf decanter. It can capture log messages jmx and system informations and push them among others into elastic search.

Christian Schneider
  • 19,420
  • 2
  • 39
  • 64
  • I am just trying to make karaf log all messages in json format. So for that I tried to use JSONEventLayout. Can you please let me know how can I achieve the same? – tuk Feb 27 '16 at 19:00
  • In decanter there currently is no appender for the json format. But you could implement a org.ops4j.pax.logging.spi.PaxAppender and publish as a service. Inside you could then feed into the json appender. – Christian Schneider Feb 27 '16 at 19:04
  • The fragment approach is one of the ways to add custom appenders to Pax-Logging. The issue here seems more like to be a correct import-package issue – Achim Nierbeck Feb 29 '16 at 07:31