[Spring Boot] REST API의 request header, body logging 설정하기

2020. 10. 20. 21:31Spring/Basic

반응형

Spring Boot 애플리케이션에서의 logging 설정

우리는 웹 애플리케이션에서 발생된 요청 정보를 로그파일로 남기기위해 logging 설정을 합니다.

Spring Boot 에서는 패키지 경로에 따른 logging level을 프로퍼티 키 값으로 간단히 설정할 수 있습니다.
관련된 예약된 프로퍼티 키는 logging.level 입니다.

logging level : off, trace, debug, info, warn, error, fatal


rest api 요청에 관한 logging 설정하기

REST API request에 관한 logging은 org.springframework.web 패키지에 해당되며, 이에 관한 로깅을 로그 기록으로 남기고 싶다면 logging.level.org.springframework.web 을 설정하거나, logging.level.web을 설정하면 됩니다.

logging group 중 미리 약속된 그룹들이 몇가지 있는데, 그 중 web은 web과 관련된 패키지들의 그룹으로 rest api 관련 로깅설정을 위해 추가해야합니다.

※ web에 포함되어있는 패키지 : org.springframework.core.codec, org.springframework.http, org.springframework.web가 포함되어있습니다.


logging:
  exception-conversion-word: '%wEx'
  pattern:
    console: '%d{yyyy-MM-dd HH:mm:ss.SSS} %clr(${LOG_LEVEL_PATTERN:-%5p}){green} %clr([%22thread]){magenta} %clr(%-40.40logger{39}){cyan} %clr(: %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}){faint}'
  level:
    web: debug

application.yml

rest api를 호출한 정보를 로그로 출력을 위해 프로퍼티에 logging.level.web=debug를 추가했습니다.

web의 로깅 레벨을 debug로 설정한 후 demo api를 요청해보았습니다.

2020-10-20 17:07:31.413 -DEBUG [  http-nio-8989-exec-8] o.s.web.servlet.DispatcherServlet        : PATCH "/api/v1/users/2", parameters={}
2020-10-20 17:07:31.414 -DEBUG [  http-nio-8989-exec-8] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped to me.jiniworld.demo.controllers.api.v1.UserController#patch(long, UserValue)
2020-10-20 17:07:31.415 -DEBUG [  http-nio-8989-exec-8] m.m.a.RequestResponseBodyMethodProcessor : Read "application/json;charset=UTF-8" to [me.jiniworld.demo.models.values.UserValue@24db23b8]
2020-10-20 17:07:31.426 -DEBUG [  http-nio-8989-exec-8] o.s.w.s.m.m.a.HttpEntityMethodProcessor  : Using 'application/json', given [*/*] and supported [application/json, application/*+json]
2020-10-20 17:07:31.426 -DEBUG [  http-nio-8989-exec-8] o.s.w.s.m.m.a.HttpEntityMethodProcessor  : Nothing to write: null body
2020-10-20 17:07:31.426 -DEBUG [  http-nio-8989-exec-8] o.s.web.servlet.DispatcherServlet        : Completed 204 NO_CONTENT

위의 로그는 demo api 중 user정보를 수정하는 api를 호출했을 때 발생된 로그입니다.

요청 시간이나 requestURI는 잘 출력되지만, request 요청시 설정했던 header나 body 정보는 나와있지 않네요.

만일 request 상에 설정한 header나 body정보를 log에 남기고 싶다면 추가 설정을 해야합니다.


request header, body에 관한 logging 설정하기

CommonsRequestLoggingFilter 를 이용하여 request 실행 전 후로 logging을 남기도록 합니다.
CommonsRequestLoggingFilter는 org.springframework.web.filter에 내장된 클래스로, 간단한 Bean 설정으로 로깅을 남기도록 해줍니다.

import org.springframework.web.filter.CommonsRequestLoggingFilter;

@Configuration
public class WebConfig {

	@Bean
	public CommonsRequestLoggingFilter requestLoggingFilter() {
		CommonsRequestLoggingFilter c = new CommonsRequestLoggingFilter();
		c.setIncludeHeaders(true);
		c.setIncludeQueryString(true);
		c.setIncludePayload(true);
		c.setIncludeClientInfo(true);
		c.setMaxPayloadLength(100000);
		return c;
	}
}

request에 포함된 header, query, body(payload), client정보 등을 로그에 남길지 설정할 수 있습니다.

header, query, body(= payload), client정보를 모두 남기도록 하고, body의 출력 최대길이를 100000로 설정한 후 다시 웹 애플리케이션을 실행해봅니다.

2020-10-20 17:26:22.710 -DEBUG [  http-nio-8989-exec-9] o.s.w.f.CommonsRequestLoggingFilter      : Before request [PATCH /api/v1/users/2, client=0:0:0:0:0:0:0:1, session=908952E22808795D34F43DA090FBEC24, user=jini, headers=[host:"localhost:8989", connection:"keep-alive", content-length:"33", accept:"*/*", authorization:"Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjoiamluaSIsImV4cCI6MTYwMzE4NDE3MjcyNn0.wBHSXQ_1acMVicKtnBTXIZVk5I5T1hVHzqco1dJML20", user-agent:"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.75 Safari/537.36", origin:"http://localhost:8989", sec-fetch-site:"same-origin", sec-fetch-mode:"cors", sec-fetch-dest:"empty", referer:"http://localhost:8989/swagger-ui/index.html?operationsSorter=method&tagsSorter=alpha&url=/api-docs", accept-encoding:"gzip, deflate, br", accept-language:"ko-KR,ko;q=0.9", cookie:"XSRF-TOKEN=af63f65f-580c-4f74-ac32-70195214ecf8; JSESSIONID=908952E22808795D34F43DA090FBEC24", Content-Type:"application/json;charset=UTF-8"]]
2020-10-20 17:26:22.710 -DEBUG [  http-nio-8989-exec-9] o.s.web.servlet.DispatcherServlet        : PATCH "/api/v1/users/2", parameters={}
2020-10-20 17:26:22.711 -DEBUG [  http-nio-8989-exec-9] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped to me.jiniworld.demo.controllers.api.v1.UserController#patch(long, UserValue)
2020-10-20 17:26:22.712 -DEBUG [  http-nio-8989-exec-9] m.m.a.RequestResponseBodyMethodProcessor : Read "application/json;charset=UTF-8" to [me.jiniworld.demo.models.values.UserValue@6636fa7f]
2020-10-20 17:26:22.722 -DEBUG [  http-nio-8989-exec-9] o.s.w.s.m.m.a.HttpEntityMethodProcessor  : Using 'application/json', given [*/*] and supported [application/json, application/*+json]
2020-10-20 17:26:22.722 -DEBUG [  http-nio-8989-exec-9] o.s.w.s.m.m.a.HttpEntityMethodProcessor  : Nothing to write: null body
2020-10-20 17:26:22.722 -DEBUG [  http-nio-8989-exec-9] o.s.web.servlet.DispatcherServlet        : Completed 204 NO_CONTENT
2020-10-20 17:26:22.722 -DEBUG [  http-nio-8989-exec-9] o.s.w.f.CommonsRequestLoggingFilter      : After request [PATCH /api/v1/users/2, client=0:0:0:0:0:0:0:1, session=908952E22808795D34F43DA090FBEC24, user=jini, headers=[host:"localhost:8989", connection:"keep-alive", content-length:"33", accept:"*/*", authorization:"Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjoiamluaSIsImV4cCI6MTYwMzE4NDE3MjcyNn0.wBHSXQ_1acMVicKtnBTXIZVk5I5T1hVHzqco1dJML20", user-agent:"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.75 Safari/537.36", origin:"http://localhost:8989", sec-fetch-site:"same-origin", sec-fetch-mode:"cors", sec-fetch-dest:"empty", referer:"http://localhost:8989/swagger-ui/index.html?operationsSorter=method&tagsSorter=alpha&url=/api-docs", accept-encoding:"gzip, deflate, br", accept-language:"ko-KR,ko;q=0.9", cookie:"XSRF-TOKEN=af63f65f-580c-4f74-ac32-70195214ecf8; JSESSIONID=908952E22808795D34F43DA090FBEC24", Content-Type:"application/json;charset=UTF-8"], payload={"type":"1","birthDate":"950101"}]

CommonsRequestLoggingFilter bean을 설정 한 후, request 로그 맨위와 맨아래에 request 관련 로그가 추가되었습니다. (ln 1, ln 8)


++

  • CommonsRequestLoggingFilter를 이용한 request header, body log 기록
  • Spring Boot http request logging 설정
  • Spring Boot requestBody logging filter 설정하기
  • Rest API request body, header logging 설정하기
728x90
반응형