Java – how to redirect AWS SDK log output
Even if I'm using logback and configuring it, I keep getting stdout I can't get AWS out of the console
Jun 19,2014 3:46:40 PM com.amazonaws.http.AmazonHttpClient executeHelper INFO: Unable to execute HTTP request: The target server Failed to respond org.apache.http.NoHttpResponseException: The target server Failed to respond at org.apache.http.impl.conn.DefaultHttpResponseParser.parseHead(DefaultHttpResponseParser.java:95) at org.apache.http.impl.conn.DefaultHttpResponseParser.parseHead(DefaultHttpResponseParser.java:62) at org.apache.http.impl.io.AbstractMessageParser.parse(AbstractMessageParser.java:254) at org.apache.http.impl.AbstractHttpClientConnection.receiveResponseHeader(AbstractHttpClientConnection.java:289) at org.apache.http.impl.conn.DefaultClientConnection.receiveResponseHeader(DefaultClientConnection.java:252) at org.apache.http.impl.conn.ManagedClientConnectionImpl.receiveResponseHeader(ManagedClientConnectionImpl.java:191) at org.apache.http.protocol.HttpRequestExecutor.doReceiveResponse(HttpRequestExecutor.java:300) at com.amazonaws.http.protocol.SdkHttpRequestExecutor.doReceiveResponse(SdkHttpRequestExecutor.java:66) at org.apache.http.protocol.HttpRequestExecutor.execute(HttpRequestExecutor.java:127) at org.apache.http.impl.client.DefaultRequestDirector.tryExecute(DefaultRequestDirector.java:713) at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:518) at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:906) at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:805) at com.amazonaws.http.AmazonHttpClient.executeHelper(AmazonHttpClient.java:402) at com.amazonaws.http.AmazonHttpClient.execute(AmazonHttpClient.java:245) at com.amazonaws.services.s3.AmazonS3Client.invoke(AmazonS3Client.java:3573) at com.amazonaws.services.s3.AmazonS3Client.getObjectMetadata(AmazonS3Client.java:990) at com.amazonaws.services.s3.AmazonS3Client.getObjectMetadata(AmazonS3Client.java:970) at com.here.prime.cdtfilter.S3MapStore$$anonfun$1.apply(S3MapStore.scala:49) at com.here.prime.cdtfilter.S3MapStore$$anonfun$1.apply(S3MapStore.scala:48) at com.here.prime.utils.Utils$.retry(Utils.scala:26)
This is my logback configuration:
<configuration debug="false" scan="true" scanPeriod="30 seconds"> <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern> </encoder> </appender> <appender name="FILE" class="ch.qos.logback.core.FileAppender"> <file>cdtxfilter.log</file> <append>true</append> <encoder> <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern> </encoder> </appender> <logger name="com.amazonaws.request" level="WARN"> </logger> <root level="DEBUG"> <!--<appender-ref ref="STDOUT" />--> <appender-ref ref="FILE" /> </root> </configuration>
Solution:
Force login through logback instead of Commons logging:
In build Add to SBT:
resolvers ++= Seq( "version99 Empty loggers" at "http://version99.qos.ch",) libraryDependencies ++= Seq( "org.slf4j" % "jcl-over-slf4j" % "1.7.7","commons-logging" % "commons-logging" % "99-empty","ch.qos.logback" % "logback-classic" % "1.0.13",)
In logback XML, fine tune the log level of noisy classes in AWS SDK:
<configuration... [..] <logger name="com.amazonaws" level="ERROR"/> <logger name="org.apache.http" level="INFO" /> </configuration>
Solution
First of all, I want to say that logging into Java is a mess for historical reasons. You should be ready to make the right efforts
Now, your question
First, it really looks like you're bypassing logs in stdout backtracking (at least they don't follow any of the patterns defined in your logarithmic configuration)
There may be two reasons:
>You mistakenly configured logback in an unlikely way (verify by checking whether any log entries in your configured logback file are written to them). > Logs processed by AWS SDK (the logging system used by AWS SDK is likely), or redirect log records to logs such as slf4j (likely, because this requires some explicit configuration Classpaths)
Now let's deal with this. I suggest you start with this article to learn about Java logging
Next, in order to solve your problem, I suggest you configure common logging systems (commons logging, log4j, etc.), boot their logs to slf4j, and use logback as the slf4j implementation
Read this and this (if you use maven, otherwise find a way to exclude JCL and log4j related to your build system) to understand what should and should not be placed in your classpath
One of my projects uses AWS SDK and sets logging according to the above recommendations
In my POM In XML, I set the following dependencies:
... <repositories> <repository> <id>version99</id> <url>http://version99.qos.ch/</url> </repository> </repositories> <dependencyManagement> <dependencies> <dependency> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> <version>99-empty</version> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>99-empty</version> </dependency> </dependencies> </dependencyManagement> <dependencies> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.7</version> </dependency> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>1.1.2</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>log4j-over-slf4j</artifactId> <version>1.7.7</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>jcl-over-slf4j</artifactId> <version>1.7.7</version> </dependency> ... </dependencies> ...
... and I have such a logback in my classpath xml:
<appender name="FILE" class="ch.qos.logback.core.FileAppender"> <file>logs.log</file> <append>false</append> <encoder> <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern> </encoder> </appender> <root level="debug"> <appender-ref ref="FILE" /> </root>
... and all logs are finally written to my log file
This should give you some ideas on how to configure dependency / logging
Always clarify unclear moments in the comments