我们在客户端使用Restlet 2.1.6与基于Restlet构建的服务器进行通信。尝试我们可能无法记录文本(JSON或XML)甚至是我们即将发送到服务器的整个HTTP请求。我们使用Slf4j而不是Log4j作为我们的日志工具。
我们通过在Spring上下文中设置系统属性来配置Restlet及其Slf4jLoggerFacade:
<bean id="systemPrereqs"
class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
<property name="targetObject" value="#{@systemProperties}" />
<property name="targetMethod" value="putAll" />
<property name="arguments">
<!-- The new Properties -->
<util:properties>
<prop key="org.restlet.engine.loggerFacadeClass">org.restlet.ext.slf4j.Slf4jLoggerFacade</prop>
</util:properties>
</property>
</bean>
我们对Restlet的Log4j配置如下所示:
log4j.logger.org.restlet=debug
我们非常确定系统属性正在运行,因为日志确实包含新条目,它只是不包含我们需要的细节。以下是Restlet输出到日志的内容的摘录:
2013-12-11 09:52:10,860 INFO taskScheduler-1 org.restlet:141 - Starting the HTTP client
2013-12-11 09:52:10,961 DEBUG taskScheduler-1 org.restlet:96 - The length of the message body is unknown. The entity must be handled carefully and consumed entirely in order to surely release the connection.
2013-12-11 09:52:14,716 INFO Finalizer org.restlet:141 - Stopping the HTTP client
现在我们通过将Representation提取到一个临时字符串,记录它,然后返回一个新的Representation,以一种昂贵的方式登录。我们必须这样做,因为表示可能是基于流的并且通过阅读来消费。
private Representation logIt(Representation representation) {
String representationText = representation.getText();
logger.trace(representationText);
representation = new StringRepresentation(representationText);
return representation;
}
我们如何让Restlet从客户端记录实际的请求/响应文本并避免字符串复制和表示重构?