2020. 10. 20. 21:31ㆍSpring/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 설정하기
'Spring > Basic' 카테고리의 다른 글
[Spring] yml 파일의 값을 상수로 초기화 하기 (0) | 2022.04.08 |
---|---|
[Spring Boot Core] Spring Boot Relaxed Binding using yaml (0) | 2022.03.30 |
[Thymeleaf] inline javascript에서 유니코드로 표기된 한글문자 한글로 표기 (0) | 2020.06.18 |
[Spring Boot] 프로퍼티 파일(yml) 여러개 설정하기 (0) | 2020.05.29 |
[Spring Boot] JavaConfig로 Datasource 설정하기 (0) | 2020.04.05 |