0

We are using a library called logback-ext-cloudwatch-appender to send our logback-based logs to AWS Cloudwatch. This is what the dependency looks like in our pom.xml file.

    <dependency>
        <groupId>org.eluder.logback</groupId>
        <artifactId>logback-ext-cloudwatch-appender</artifactId>
        <version>1.0-SNAPSHOT</version>
    </dependency>

A few days ago these errors started appearing in our logs.

java.lang.NoSuchMethodError: com.amazonaws.transform.JsonErrorUnmarshaller: method <init>(Ljava/lang/Class;)V not found
    at com.amazonaws.services.logs.model.transform.InvalidParameterExceptionUnmarshaller.<init>(InvalidParameterExceptionUnmarshaller.java:26)
    at com.amazonaws.services.logs.AWSLogsClient.init(AWSLogsClient.java:280)
    at com.amazonaws.services.logs.AWSLogsClient.<init>(AWSLogsClient.java:275)
    at com.amazonaws.services.logs.AWSLogsClient.<init>(AWSLogsClient.java:248)
    at org.eluder.logback.ext.cloudwatch.appender.AbstractCloudWatchAppender.doStart(AbstractCloudWatchAppender.java:100)
    at org.eluder.logback.ext.aws.core.AbstractAwsEncodingStringAppender.start(AbstractAwsEncodingStringAppender.java:123)
    at org.eluder.logback.ext.cloudwatch.appender.AbstractCloudWatchAppender.start(AbstractCloudWatchAppender.java:95)
    at ch.qos.logback.ext.spring.DelegatingLogbackAppender.getDelegate(Unknown Source)
    at ch.qos.logback.ext.spring.DelegatingLogbackAppender.append(Unknown Source)
    at ch.qos.logback.ext.spring.DelegatingLogbackAppender.append(Unknown Source)
    at ch.qos.logback.core.UnsynchronizedAppenderBase.doAppend(UnsynchronizedAppenderBase.java:84)
    at ch.qos.logback.core.spi.AppenderAttachableImpl.appendLoopOnAppenders(AppenderAttachableImpl.java:48)
    at ch.qos.logback.classic.Logger.appendLoopOnAppenders(Logger.java:270)
    at ch.qos.logback.classic.Logger.callAppenders(Logger.java:257)
    at ch.qos.logback.classic.Logger.buildLoggingEventAndAppend(Logger.java:421)
    at ch.qos.logback.classic.Logger.filterAndLog_0_Or3Plus(Logger.java:383)
    at ch.qos.logback.classic.Logger.info(Logger.java:579)
    (truncated)

I found out that we had upgraded to AWS 1.11.5, but I couldn't find any evidence of such a bug in that release.

1 Answer 1

3

It turns out that the current version of logback-ext-cloudwatch-appender has a transitive dependency on a specific version of aws-java-sdk-logs 1.10.2, which is not compatible with other aws-java-sdk libraries 1.11.0 and above. We do use a number of other aws-java-sdk libraries. We excluded the dependency like this.

<dependency>
    <groupId>org.eluder.logback</groupId>
    <artifactId>logback-ext-cloudwatch-appender</artifactId>
    <version>1.0-SNAPSHOT</version>
    <exclusions>
        <exclusion>
            <groupId>com.amazonaws</groupId>
            <artifactId>aws-java-sdk-core</artifactId>
        </exclusion>
        <exclusion>
            <groupId>com.amazonaws</groupId>
            <artifactId>aws-java-sdk-logs</artifactId>
        </exclusion>
    </exclusions>
</dependency>
<dependency>
    <groupId>com.amazonaws</groupId>
    <artifactId>aws-java-sdk-core</artifactId>
    <version>1.11.5</version>
</dependency>
<dependency>
    <groupId>com.amazonaws</groupId>
    <artifactId>aws-java-sdk-logs</artifactId>
    <version>1.11.5</version>
</dependency>

At that point we started getting another error.

 Exception in thread "org.myorg.task.MyTask working" java.lang.NoSuchMethodError: com.amazonaws.services.logs.AWSLogsClient.createLogGroup(Lcom/amazonaws/services/logs/model/CreateLogGroupRequest;)V
         at org.eluder.logback.ext.cloudwatch.appender.AbstractCloudWatchAppender.createLogGroup(AbstractCloudWatchAppender.java:171)
         at org.eluder.logback.ext.cloudwatch.appender.AbstractCloudWatchAppender.doStart(AbstractCloudWatchAppender.java:107)
         at org.eluder.logback.ext.aws.core.AbstractAwsEncodingStringAppender.start(AbstractAwsEncodingStringAppender.java:123)
         at org.eluder.logback.ext.cloudwatch.appender.AbstractCloudWatchAppender.start(AbstractCloudWatchAppender.java:95)
         at ch.qos.logback.core.joran.action.AppenderAction.end(AppenderAction.java:90)
         at ch.qos.logback.core.joran.spi.Interpreter.callEndAction(Interpreter.java:309)
         at ch.qos.logback.core.joran.spi.Interpreter.endElement(Interpreter.java:193)
         at ch.qos.logback.core.joran.spi.Interpreter.endElement(Interpreter.java:179)
         at ch.qos.logback.core.joran.spi.EventPlayer.play(EventPlayer.java:62)
         at ch.qos.logback.core.joran.GenericConfigurator.doConfigure(GenericConfigurator.java:155)
         at ch.qos.logback.core.sift.SiftingJoranConfiguratorBase.doConfigure(SiftingJoranConfiguratorBase.java:82)
         at ch.qos.logback.core.sift.AbstractAppenderFactoryUsingJoran.buildAppender(AbstractAppenderFactoryUsingJoran.java:51)
         at ch.qos.logback.core.sift.AppenderTracker.buildComponent(AppenderTracker.java:56)
         at ch.qos.logback.core.sift.AppenderTracker.buildComponent(AppenderTracker.java:32)
         at ch.qos.logback.core.spi.AbstractComponentTracker.getOrCreate(AbstractComponentTracker.java:124)
         at ch.qos.logback.core.sift.SiftingAppenderBase.append(SiftingAppenderBase.java:104)
         at ch.qos.logback.core.AppenderBase.doAppend(AppenderBase.java:82)
         at ch.qos.logback.core.spi.AppenderAttachableImpl.appendLoopOnAppenders(AppenderAttachableImpl.java:48)
         at ch.qos.logback.classic.Logger.appendLoopOnAppenders(Logger.java:270)
         at ch.qos.logback.classic.Logger.callAppenders(Logger.java:257)
         at ch.qos.logback.classic.Logger.buildLoggingEventAndAppend(Logger.java:421)
         at ch.qos.logback.classic.Logger.filterAndLog_0_Or3Plus(Logger.java:383)
         at ch.qos.logback.classic.Logger.info(Logger.java:579)

Merely excluding the dependencies did not work. I had to fork and rebuild the logback-ext-cloudwatch-appender jar with a dependency on the current 1.11.5 aws-java-sdk libraries. Trying to use the new AWS dependencies with the logback-ext-cloudwatch-appender jar which had been built against the old libraries caused a mismatch in the method signature (return type) of createLogGroup which caused a runtime error. To get this to run, I only had to change the pom.xml files, not the source code, in my forked version.

Sign up to request clarification or add additional context in comments.

3 Comments

I interpreted this answer as "go take a look at my dependencies." I updated my aws-java-sdk and aws-java-sdk-core to the latest versions as shown on MavenCentral and it fixed the error for me!
If you're not using the logback-ext-cloudwatch-appender like we are, which is not a part of AWS, then yes, I agree. That's the high level description of how to get to the fix.
I had the same problem in my cloudwatch appender. I think I worked around it using reflection on the createLogGroup call: github.com/j256/cloudwatch-logback-appender/commit/…

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.