我一直在STDOUT上得到这些,即使我使用logback并配置了它。我无法从控制台中取出AWS的东西。
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)
这是我的logback配置:
<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>
解决方案:
通过logback强制日志记录,而不是common_logging:
在构建。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",
)
在logback.xml中,微调AWS SDK中嘈杂类的日志级别:
<configuration...
[..]
<logger name="com.amazonaws" level="ERROR"/>
<logger name="org.apache.http" level="INFO" />
</configuration>
首先我想说的是,由于历史原因,在java中登录是一团糟,你应该准备好投入一些努力来纠正它。
现在解决你的问题。
首先,它看起来真的像您在STDOUT中获得的日志绕过logback(至少它们不遵循您的logback配置中定义的任何模式)。
可能有两个原因:
-
您以某种方式错误配置了logback,这是不太可能的(通过检查是否有任何日志条目最终出现在您已配置logback写入的文件中来验证这一点)。
-
来自AWS sdk的日志由commons logging处理(最有可能,因为这是AWS sdk使用的日志系统),或者模仿commons logging将日志重定向到,例如SLF4J(不太可能,因为这需要一些显式的类路径配置)。
为了解决这个问题,我建议您从这篇文章开始了解java的日志动物园。
接下来,为了解决您的问题,我建议您配置流行的日志系统(commons logging, log4j等),将其日志定向到SLF4j,并使用logback作为SLF4j实现。
阅读这个,和这个(如果你使用maven,否则找到一种方法来排除jcl和log4j相关的构建系统)来理解什么应该和什么不应该放在你的类路径。
我的一个项目使用AWS sdk,并按照上面的建议设置了日志记录。
在我的pom.xml
中,我设置了这样的依赖项:
...
<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>
...
…在我的类路径中,logback.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>
…并且所有的日志最终都被写入我的日志文件。
这应该给你一些关于依赖/日志应该如何配置的想法。
请随意在评论中澄清不清楚的时刻。
您将消息发送到STDOUT最有可能是因为在运行时类路径中有一些东西,它正在记录到STDOUT (f.ex)。一个使用apache Commons日志的类,就像之前的帖子中建议的那样)。不仅仅是使用logback,这意味着所有的日志都要经过logback。
要控制应用程序中的所有日志记录,您必须:
A)检查您的类路径并删除所有其他日志库的二进制文件 (common -logging, log4j等),如果您使用maven,运行mvn dependency:tree -X
,然后使用排除来删除对日志库的依赖。
C)通过SLF4J将日志从源代码引导到Logback。有一个迁移器可以减轻您的工作。看看它是否能帮到你。
D)在logback.xml或logback.groovy中配置您的logback。