RestTemplate Logging

효율적인 RestTemplate 요청/응답 로깅을 구현하는 방법

BAD CASE

나쁜 케이스로는 특정 레벨을 디버그로 처리하는 방식입니다.

logging.level.org.springframework.web.client.RestTemplate=DEBUG

요청 URL및 상태가 찍히지만 정리되지 않고 여러 줄이 찍혀 어지러운 모습입니다.

o.s.w.c.RestTemplate - HTTP POST http://localhost:8082/spring-rest/persons
o.s.w.c.RestTemplate - Accept=[text/plain, application/json, application/*+json, */*]
o.s.w.c.RestTemplate - Writing [my request body] with org.springframework.http.converter.StringHttpMessageConverter
o.s.w.c.RestTemplate - Response 200 OK

또한 응답(body)는 확인할 수 없기에, 단점이 존재합니다

GOOD CASE

ClientHttpRequestInterceptor를 사용해 로깅을 하는 방식입니다.

@Configuration
class RestTemplateConfig {
    @Bean
    fun restTemplate():RestTemplate = RestTemplate()
        .also {
            it.interceptors.add(LoggingRequestInterceptor(
                listOf(CONTENT_TYPE, ACCEPT),
                listOf("KEY"))
            )
        }

    class LoggingRequestInterceptor(
        private val valuableRequest :List<String>,
        private val valuableResponse :List<String>

    ) : ClientHttpRequestInterceptor {
        private val log: Logger = getLogger("REST API")

        override fun intercept(request: HttpRequest, body: ByteArray, execution: ClientHttpRequestExecution): ClientHttpResponse {
            log.info("[API REQUEST] URI: ${request.method} ${request.uri} HEADER : [${valuableRequestHeader(request.headers, valuableRequest)}] BODY : [${String(body)}]")
            val response = execution.execute(request, body)
            log.info("[API RESPONSE] URI: ${response.statusCode} ${response.statusText} HEADER : [${valuableResponseHeader(response.headers, valuableResponse)}] BODY : [${String(body)}]")
            return response
        }
        private fun valuableRequestHeader(httpHeaders: HttpHeaders,key:List<String>) = httpHeaders
            .filter { key.contains(it.key) }

        private fun valuableResponseHeader(httpHeaders: HttpHeaders,key:List<String>)= httpHeaders
            .filter { key.contains(it.key) }
    }
}
INFO REST API : [API REQUEST] URI: POST https://dummy.restapiexample.com/api/v1/create HEADER : [{Accept=[text/plain, application/json, application/*+json, */*], Content-Type=[text/plain;charset=ISO-8859-1]}] BODY : [{
    "status": "success",
    "data": {
    "name": "junnyland",
    "salary": "10000000",
    "age": "27",
    "id": 100
}]
INFO REST API : [API RESPONSE] URI: 200 OK OK HEADER : [{}] BODY : [{
    "status": "success",
    "data": {
    "name": "junnyland",
    "salary": "10000000",
    "age": "27",
    "id": 100
}]

이와같이 요청, 응답의 대한 로그를 정확하게 찍을 수 있습니다.

Last updated