【问题标题】:Request & Response Payload is printing in pretty print format JSON using ClientHttpRequestInterceptor请求和响应有效负载正在使用 ClientHttpRequestInterceptor 以漂亮的打印格式 JSON 打印
【发布时间】:2021-09-07 16:13:16
【问题描述】:

我正在尝试使用以下方式在日志文件中以漂亮的 JSON 格式漂亮地打印我的 restTemplate 请求和响应:

public static RestTemplate createNewRestTemplateWithLogging() {
        ClientHttpRequestInterceptor interceptor = new RestLoggingInterceptor();
        List<ClientHttpRequestInterceptor> interceptorList = new ArrayList<ClientHttpRequestInterceptor>();
        RestTemplate restTemplate = new RestTemplate();
        interceptorList.add(interceptor);
        restTemplate.setInterceptors(interceptorList);
        restTemplate.setRequestFactory(new BufferingClientHttpRequestFactory(new SimpleClientHttpRequestFactory()));
        return restTemplate;
        
    }

log4j2.xml 如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
    <Appenders>
        <RollingFile name="rest_messages_file_appender" fileName="servers/AdminServer/logs/abc.log"
            filePattern="servers/AdminServer/logs/abc-%i.log.gz">
            <LevelRangeFilter maxLevel="INFO" />
            <PatternLayout>
                <Pattern>%d{DEFAULT} %-5p [%c{1}] [%X{hostName}] [%X{transactionId}]
                    [%X{uuid}|%X{username}|%X{caseNum}]:
                    %replace{%msg}{(\r|\n|\r\n)+}{}%n</Pattern>
            </PatternLayout>
            <Policies>
                <SizeBasedTriggeringPolicy size="10MB" />
            </Policies>
            <DefaultRolloverStrategy max="30" />
        </RollingFile>
        <Console name="STDOUT" target="SYSTEM_OUT">
            <PatternLayout pattern="%m%n"/>
        </Console>
    </Appenders>
    <Loggers>
        <Logger
            name="com.accenture.apsp.architecture.rest.log.interceptor.RestLoggingInterceptor"
            level="INFO" additivity="false">
            <AppenderRef ref="rest_messages_file_appender" />
        </Logger>
        <Root level="INFO">
            <AppenderRef ref="rest_messages_file_appender" />
            <AppenderRef ref="STDOUT"/>
        </Root>
    </Loggers>
</Configuration> 

我也使用了标签,但它仍然不起作用。

对于任何 JSON,它都显示如下:

Outbound Message----------------------------Direction: OUTAddress: http://apsp-opa:7017/opa/determinations-server/batch/auth?grant_type=client_credentials&client_id=rulescompuser&client_secret=Welcome@99Headers: [Accept:"application/json, application/*+json", Content-Type:"application/json", Content-Length:"2"]Total Time (ms): 14Request Time: 2021-06-23 06:56:05,613Request Payload: {}Response Time: 2021-06-23 06:56:05,627Response Payload: {"access_token":"f541be05-580e-123c-c43a-ca4e0ee567bc","token_type":"Bearer","expires_in":1800}----------------------------

有没有办法/模式为 log4j2.xml 中的响应有效负载打印格式化的 JSON。

/**
 * 
 * @param response
 * @param wsLoggingContext
 */
public void logResponse(ClientHttpResponse response, LoggingContext wsLoggingContext) {
    try {
        wsLoggingContext.setResponseTime(new Date());
        wsLoggingContext.setResponseJson(StreamUtils.copyToString(response.getBody(), Charset.defaultCharset()));
    
    } catch (Exception e) {
        REST_LOGGER.info("Error occured while logging" + e);
    }
}

我们如何才能漂亮地打印请求和响应负载。

【问题讨论】:

    标签: java spring-boot log4j2


    【解决方案1】:

    如果我理解 log4j 文档,这部分模式是他的错误 %replace{%msg}{(\r|\n|\r\n)+}{} 在这里你将每个换行符都替换为空。

    那么你可以:

    • 留言(请勿更换)
    • %replace{%msg}{(\r|\n)+}{\r\n}如果你有换行问题。

    或者也许是你的 json 一开始格式不正确。

    如果你使用它,spring有这个属性:

    spring.jackson.serialization.indent_output = true
    

    但如果您不这样做,您可以尝试遵循这些帖子中的建议:

    【讨论】:

    • 我已经尝试过,在这种情况下,请求有效负载正在格式化,但来自 postForEntity() 的响应有效负载仍然无法正确打印。
    • {"cases":[{"@id":12345678,"isMultiMonth":true,"thecaserequiresanffmoutboundmessage":null,"programs":[{"@id":6545,"programType" :"Medicaid","programCurrentBenefitMonth":"2021-06-08","programGetsNOA":true,"programNoaProcessingDate":"2021-06-24","programCaseId":1.00032277E9,"programsCurrentEdbcId":67895,"programsedbcs ":[{"@id":123,"isTheCurrentEDBC":true,"programsedbcsbudgets":[{"@id":456,"programsedbcsbudgetspeople":[{"@id":789,"programsedbcsbudgetspersonsindividualaidcodeactions":[]} ]}
    • 我找到了另一个解决方案。我已经编辑了答案。
    • 它不起作用...实际上来自 RestTemplate 的 JSON 响应直接打印在日志中,因此无法正确打印。有什么方法可以格式化吗?
    • 我在我的答案中添加了一些链接
    猜你喜欢
    • 2020-11-28
    • 1970-01-01
    • 2014-05-19
    • 2011-03-21
    • 2011-05-06
    • 1970-01-01
    • 2011-08-28
    相关资源
    最近更新 更多