From 4832e0012b2359c1d7f62793efc0e1efca06267d Mon Sep 17 00:00:00 2001 From: gardening-y Date: Wed, 2 Oct 2024 22:58:24 +0900 Subject: [PATCH 01/13] =?UTF-8?q?[feat]=20MDCManage=20=EA=B5=AC=ED=98=84?= =?UTF-8?q?=20-=20#226?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/dateroad/mdc/MDCManager.java | 93 +++++++++++++++++++ 1 file changed, 93 insertions(+) create mode 100644 dateroad-common/src/main/java/org/dateroad/mdc/MDCManager.java diff --git a/dateroad-common/src/main/java/org/dateroad/mdc/MDCManager.java b/dateroad-common/src/main/java/org/dateroad/mdc/MDCManager.java new file mode 100644 index 0000000..fc0f73f --- /dev/null +++ b/dateroad-common/src/main/java/org/dateroad/mdc/MDCManager.java @@ -0,0 +1,93 @@ +package org.dateroad.mdc; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import jakarta.servlet.http.Cookie; +import jakarta.servlet.http.HttpServletRequest; +import lombok.extern.slf4j.Slf4j; +import org.slf4j.MDC; +import org.slf4j.spi.MDCAdapter; +import org.springframework.stereotype.Component; +import org.springframework.web.util.WebUtils; + +import java.util.HashMap; +import java.util.Map; + +@Slf4j +@Component +public class MDCManager { + public static final String MDC_REQUEST_URI = "Request URI"; + public static final String MDC_USER_IP = "사용자 IP"; + public static final String MDC_REQUEST_COOKIES = "Request Cookie"; + public static final String MDC_REQUEST_ORIGIN = "Request Origin"; + public static final String MDC_HEADER = "HTTP Header"; + public static final String MDC_PARAMETER = "Parameter"; + public static final String MDC_BODY = "HTTP Body"; + private static final ObjectMapper objectMapper = new ObjectMapper(); + private static final MDCAdapter mdcAdapter = MDC.getMDCAdapter(); + public static void set(String key, String value) { + mdcAdapter.put(key, value); + } + + public static Object get(String key) { + return mdcAdapter.get(key); + } + + public static void setJsonValue(String key, Object value) throws JsonProcessingException { + try { + if (value != null) { + String json = objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(value); + mdcAdapter.put(key, json); + } else { + mdcAdapter.put(key, "내용이 없습니다."); + } + } catch (JsonProcessingException ex) { + throw ex; + } + } + + public static String getUserIP(HttpServletRequest request) { + String ip = request.getHeader("X-Forwarded-For"); + if (ip == null) + ip = request.getRemoteAddr(); + + return ip; + } + + public static Cookie[] getCookies(HttpServletRequest request) { + return request.getCookies(); + } + + public static String getRequestOrigin(HttpServletRequest request) { + return request.getHeader("Origin"); + } + + public static Map getHeader(HttpServletRequest request) { + Map headerMap = new HashMap<>(); + request.getHeaderNames().asIterator() + .forEachRemaining(name -> { + if (!name.equals("user-agent")) { + headerMap.put(name, request.getHeader(name)); + } + }); + return headerMap; + } + + public static Map getParameter(HttpServletRequest request) { + Map paramMap = new HashMap<>(); + request.getParameterNames().asIterator() + .forEachRemaining(name -> paramMap.put(name, request.getParameter(name))); + + return paramMap; + } + + public static String getBody(HttpServletRequest request) { + RequestBodyWrapper requestBodyWrapper = WebUtils.getNativeRequest(request, RequestBodyWrapper.class); + + if (requestBodyWrapper != null) { + return requestBodyWrapper.getRequestBody(); + } + + return "requestBody 정보 없음"; + } +} From 0f8399b1ddb7fcb10589b17b1b6d00581371d490 Mon Sep 17 00:00:00 2001 From: gardening-y Date: Wed, 2 Oct 2024 23:06:50 +0900 Subject: [PATCH 02/13] =?UTF-8?q?[feat]=20MDCFilter=20=EA=B5=AC=ED=98=84?= =?UTF-8?q?=20-=20#226?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/org/dateroad/mdc/MDCFilter.java | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 dateroad-common/src/main/java/org/dateroad/mdc/MDCFilter.java diff --git a/dateroad-common/src/main/java/org/dateroad/mdc/MDCFilter.java b/dateroad-common/src/main/java/org/dateroad/mdc/MDCFilter.java new file mode 100644 index 0000000..40b70d7 --- /dev/null +++ b/dateroad-common/src/main/java/org/dateroad/mdc/MDCFilter.java @@ -0,0 +1,29 @@ +package org.dateroad.mdc; + +import jakarta.servlet.FilterChain; +import jakarta.servlet.ServletException; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.filter.OncePerRequestFilter; +import org.springframework.web.util.WebUtils; + +import java.io.IOException; + +@Slf4j +public class MDCFilter extends OncePerRequestFilter { + @Override + protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { + HttpServletRequest httpReq = WebUtils.getNativeRequest(request, HttpServletRequest.class); + + MDCManager.setJsonValue(MDCManager.MDC_REQUEST_URI, MDCManager.getRequestUri(httpReq)); + MDCManager.setJsonValue(MDCManager.MDC_USER_IP, MDCManager.getUserIP(httpReq)); + MDCManager.setJsonValue(MDCManager.MDC_REQUEST_COOKIES, MDCManager.getCookies(httpReq)); + MDCManager.setJsonValue(MDCManager.MDC_REQUEST_ORIGIN, MDCManager.getRequestOrigin(httpReq)); + MDCManager.setJsonValue(MDCManager.MDC_HEADER, MDCManager.getHeader(httpReq)); + MDCManager.setJsonValue(MDCManager.MDC_PARAMETER, MDCManager.getParameter(httpReq)); + MDCManager.set(MDCManager.MDC_BODY, MDCManager.getBody(httpReq)); + + filterChain.doFilter(request, response); + } +} From ebc90b8a3fa3a48bb64ca72c852911cb7fa02ab4 Mon Sep 17 00:00:00 2001 From: gardening-y Date: Wed, 2 Oct 2024 23:10:58 +0900 Subject: [PATCH 03/13] =?UTF-8?q?[feat]=20MDCManager=20=EC=88=98=EC=A0=95?= =?UTF-8?q?=20-=20#226?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/org/dateroad/mdc/MDCManager.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/dateroad-common/src/main/java/org/dateroad/mdc/MDCManager.java b/dateroad-common/src/main/java/org/dateroad/mdc/MDCManager.java index fc0f73f..ff49cbe 100644 --- a/dateroad-common/src/main/java/org/dateroad/mdc/MDCManager.java +++ b/dateroad-common/src/main/java/org/dateroad/mdc/MDCManager.java @@ -46,6 +46,10 @@ public static void setJsonValue(String key, Object value) throws JsonProcessingE } } + public static String getRequestUri(HttpServletRequest request) { + return request.getRequestURI(); + } + public static String getUserIP(HttpServletRequest request) { String ip = request.getHeader("X-Forwarded-For"); if (ip == null) From 27fbc11633bcc6c7729125b3e790bdd69902b943 Mon Sep 17 00:00:00 2001 From: gardening-y Date: Wed, 2 Oct 2024 23:11:58 +0900 Subject: [PATCH 04/13] =?UTF-8?q?[del]=20=EB=B6=88=ED=95=84=EC=9A=94?= =?UTF-8?q?=ED=95=9C=20import=20=EC=A0=9C=EA=B1=B0=20-=20#226?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/org/dateroad/user/service/AuthService.java | 1 - .../test/java/org/dateroad/user/service/AuthServiceTest.java | 2 -- 2 files changed, 3 deletions(-) diff --git a/dateroad-api/src/main/java/org/dateroad/user/service/AuthService.java b/dateroad-api/src/main/java/org/dateroad/user/service/AuthService.java index e6c5830..47b5b35 100644 --- a/dateroad-api/src/main/java/org/dateroad/user/service/AuthService.java +++ b/dateroad-api/src/main/java/org/dateroad/user/service/AuthService.java @@ -19,7 +19,6 @@ import org.dateroad.point.repository.PointRepository; import org.dateroad.refreshtoken.domain.RefreshToken; import org.dateroad.refreshtoken.repository.RefreshTokenRepository; -import org.dateroad.s3.S3Service; import org.dateroad.tag.domain.DateTagType; import org.dateroad.tag.domain.UserTag; import org.dateroad.tag.repository.UserTagRepository; diff --git a/dateroad-api/src/test/java/org/dateroad/user/service/AuthServiceTest.java b/dateroad-api/src/test/java/org/dateroad/user/service/AuthServiceTest.java index 9ac7837..33fb645 100644 --- a/dateroad-api/src/test/java/org/dateroad/user/service/AuthServiceTest.java +++ b/dateroad-api/src/test/java/org/dateroad/user/service/AuthServiceTest.java @@ -10,8 +10,6 @@ import static org.mockito.Mockito.when; import java.util.List; -import java.util.Optional; -import org.assertj.core.api.Assertions; import org.dateroad.auth.jwt.JwtProvider; import org.dateroad.auth.jwt.Token; import org.dateroad.code.FailureCode; From 0a5b8b0ee5cdd1777a267eb6a5560541733e1ffa Mon Sep 17 00:00:00 2001 From: gardening-y Date: Wed, 2 Oct 2024 23:12:41 +0900 Subject: [PATCH 05/13] =?UTF-8?q?[feat]=20Discord=20FailureCode=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80=20-=20#226?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/org/dateroad/code/FailureCode.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/dateroad-common/src/main/java/org/dateroad/code/FailureCode.java b/dateroad-common/src/main/java/org/dateroad/code/FailureCode.java index 56ee8f9..8da2250 100644 --- a/dateroad-common/src/main/java/org/dateroad/code/FailureCode.java +++ b/dateroad-common/src/main/java/org/dateroad/code/FailureCode.java @@ -58,7 +58,7 @@ public enum FailureCode { * 403 Forbidden */ FORBIDDEN(HttpStatus.FORBIDDEN, "e4030", "리소스 접근 권한이 없습니다."), - DATE_DELETE_ACCESS_DENIED(HttpStatus.FORBIDDEN, "e4032", "해당 일정에 권한이 없습니다."), + DATE_DELETE_ACCESS_DENIED(HttpStatus.FORBIDDEN, "e4031", "해당 일정에 권한이 없습니다."), /** * 404 Not Found @@ -99,8 +99,9 @@ public enum FailureCode { */ INTERNAL_SERVER_ERROR(HttpStatus.INTERNAL_SERVER_ERROR, "e5000", "서버 내부 오류입니다."), COURSE_CREATE_ERROR(HttpStatus.INTERNAL_SERVER_ERROR,"e5001" , "코스 생성에 실패했습니다."), - POINT_CREATE_ERROR(HttpStatus.INTERNAL_SERVER_ERROR, "e5002", "포인트 생성에 실패했습니다"), - REDIS_CONNECTION_ERROR(HttpStatus.INTERNAL_SERVER_ERROR, "e5003", "Redis 연결에 실패했습니다"); + POINT_CREATE_ERROR(HttpStatus.INTERNAL_SERVER_ERROR, "e5002", "포인트 생성에 실패했습니다."), + REDIS_CONNECTION_ERROR(HttpStatus.INTERNAL_SERVER_ERROR, "e5003", "Redis 연결에 실패했습니다."), + DISCORD_ERROR(HttpStatus.INTERNAL_SERVER_ERROR, "e5004", "디스코드 로그 전송 내용이 존재하지 않습니다."); private final HttpStatus httpStatus; From 41d0b1df3dacef59555ec8f554da4e61610864bd Mon Sep 17 00:00:00 2001 From: gardening-y Date: Wed, 2 Oct 2024 23:13:22 +0900 Subject: [PATCH 06/13] =?UTF-8?q?[feat]=20RequestBodyWrapper=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84=20-=20#226?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/dateroad/mdc/RequestBodyWrapper.java | 66 +++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 dateroad-common/src/main/java/org/dateroad/mdc/RequestBodyWrapper.java diff --git a/dateroad-common/src/main/java/org/dateroad/mdc/RequestBodyWrapper.java b/dateroad-common/src/main/java/org/dateroad/mdc/RequestBodyWrapper.java new file mode 100644 index 0000000..8b54d80 --- /dev/null +++ b/dateroad-common/src/main/java/org/dateroad/mdc/RequestBodyWrapper.java @@ -0,0 +1,66 @@ +package org.dateroad.mdc; + +import jakarta.servlet.ReadListener; +import jakarta.servlet.ServletInputStream; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletRequestWrapper; +import lombok.Getter; +import org.dateroad.code.FailureCode; +import org.dateroad.exception.BadRequestException; + +import java.io.BufferedReader; +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStreamReader; + +@Getter +public class RequestBodyWrapper extends HttpServletRequestWrapper { + private final String requestBody; + + public RequestBodyWrapper(HttpServletRequest request) { + super(request); + + StringBuilder stringBuilder = new StringBuilder(); + try (BufferedReader bufferedReader = request.getReader()) { + char[] charBuffer = new char[128]; + int bytesRead; + while ((bytesRead = bufferedReader.read(charBuffer)) > 0) { + stringBuilder.append(charBuffer, 0, bytesRead); + } + } catch (IOException e) { + throw new BadRequestException(FailureCode.BAD_REQUEST); + } + + requestBody = stringBuilder.toString(); + } + + @Override + public ServletInputStream getInputStream() { + final ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(requestBody.getBytes()); + return new ServletInputStream() { + @Override + public boolean isFinished() { + return false; + } + + @Override + public boolean isReady() { + return false; + } + + @Override + public void setReadListener(ReadListener readListener) { + throw new UnsupportedOperationException(); + } + + public int read() { + return byteArrayInputStream.read(); + } + }; + } + + @Override + public BufferedReader getReader() { + return new BufferedReader(new InputStreamReader(this.getInputStream())); + } +} From b4b2a81a14a2ba2bc51bc8acc29f88091e4c1dce Mon Sep 17 00:00:00 2001 From: gardening-y Date: Wed, 2 Oct 2024 23:13:35 +0900 Subject: [PATCH 07/13] =?UTF-8?q?[feat]=20RequestWrappingFilter=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84=20-=20#226?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dateroad/mdc/RequestWrappingFilter.java | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 dateroad-common/src/main/java/org/dateroad/mdc/RequestWrappingFilter.java diff --git a/dateroad-common/src/main/java/org/dateroad/mdc/RequestWrappingFilter.java b/dateroad-common/src/main/java/org/dateroad/mdc/RequestWrappingFilter.java new file mode 100644 index 0000000..8d270aa --- /dev/null +++ b/dateroad-common/src/main/java/org/dateroad/mdc/RequestWrappingFilter.java @@ -0,0 +1,19 @@ +package org.dateroad.mdc; + +import jakarta.servlet.FilterChain; +import jakarta.servlet.ServletException; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.filter.OncePerRequestFilter; + +import java.io.IOException; + +@Slf4j +public class RequestWrappingFilter extends OncePerRequestFilter { + @Override + protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { + RequestBodyWrapper requestBodyWrapper = new RequestBodyWrapper(request); + filterChain.doFilter(requestBodyWrapper, response); + } +} From 5cc2299d7618e857566147abdec7ccb66bf63c75 Mon Sep 17 00:00:00 2001 From: gardening-y Date: Wed, 2 Oct 2024 23:14:31 +0900 Subject: [PATCH 08/13] =?UTF-8?q?[feat]=20MDCFilter=20=EC=88=9C=EC=84=9C?= =?UTF-8?q?=20=EC=A7=80=EC=A0=95=EC=9D=84=20=EC=9C=84=ED=95=9C=20MDCFilter?= =?UTF-8?q?Config=20=EA=B5=AC=ED=98=84=20-=20#226?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/dateroad/mdc/MDCFilterConfig.java | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 dateroad-common/src/main/java/org/dateroad/mdc/MDCFilterConfig.java diff --git a/dateroad-common/src/main/java/org/dateroad/mdc/MDCFilterConfig.java b/dateroad-common/src/main/java/org/dateroad/mdc/MDCFilterConfig.java new file mode 100644 index 0000000..5f56e7a --- /dev/null +++ b/dateroad-common/src/main/java/org/dateroad/mdc/MDCFilterConfig.java @@ -0,0 +1,24 @@ +package org.dateroad.mdc; + +import org.springframework.boot.web.servlet.FilterRegistrationBean; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Profile; + +@Profile("!local") +@Configuration +public class MDCFilterConfig { + @Bean + public FilterRegistrationBean secondFilter() { + FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean<>(new RequestWrappingFilter()); + filterRegistrationBean.setOrder(0); + return filterRegistrationBean; + } + + @Bean + public FilterRegistrationBean thirdFilter() { + FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean<>(new MDCFilter()); + filterRegistrationBean.setOrder(1); + return filterRegistrationBean; + } +} From ab33a4d895c8019c8be77a18224fa51b0987e8d8 Mon Sep 17 00:00:00 2001 From: gardening-y Date: Wed, 2 Oct 2024 23:15:12 +0900 Subject: [PATCH 09/13] =?UTF-8?q?[feat]=20SignUpEventInfo=20Builder=20Acce?= =?UTF-8?q?ss=20=EC=84=A4=EC=A0=95=20-=20#226?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/org/dateroad/event/SignUpEventInfo.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/dateroad-common/src/main/java/org/dateroad/event/SignUpEventInfo.java b/dateroad-common/src/main/java/org/dateroad/event/SignUpEventInfo.java index 33032fb..5e824fa 100644 --- a/dateroad-common/src/main/java/org/dateroad/event/SignUpEventInfo.java +++ b/dateroad-common/src/main/java/org/dateroad/event/SignUpEventInfo.java @@ -1,8 +1,9 @@ package org.dateroad.event; +import lombok.AccessLevel; import lombok.Builder; import org.dateroad.code.EventCode; -@Builder +@Builder(access = AccessLevel.PRIVATE) public record SignUpEventInfo ( EventCode eventCode, String nickName, From 1a60535fda1425c2e3ee80f1a7bdffc5d11d39d3 Mon Sep 17 00:00:00 2001 From: gardening-y Date: Wed, 2 Oct 2024 23:16:27 +0900 Subject: [PATCH 10/13] =?UTF-8?q?[feat]=20DiscordLogAppender=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84=20-=20#226?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../feign/discord/DiscordLogAppender.java | 103 ++++++++++++++++++ 1 file changed, 103 insertions(+) create mode 100644 dateroad-external/src/main/java/org/dateroad/feign/discord/DiscordLogAppender.java diff --git a/dateroad-external/src/main/java/org/dateroad/feign/discord/DiscordLogAppender.java b/dateroad-external/src/main/java/org/dateroad/feign/discord/DiscordLogAppender.java new file mode 100644 index 0000000..4035e71 --- /dev/null +++ b/dateroad-external/src/main/java/org/dateroad/feign/discord/DiscordLogAppender.java @@ -0,0 +1,103 @@ +package org.dateroad.feign.discord; + +import ch.qos.logback.classic.spi.ILoggingEvent; +import ch.qos.logback.classic.spi.IThrowableProxy; +import ch.qos.logback.classic.spi.ThrowableProxyUtil; +import ch.qos.logback.core.AppenderBase; +import io.micrometer.core.instrument.util.StringEscapeUtils; +import lombok.Setter; +import lombok.extern.slf4j.Slf4j; +import org.dateroad.mdc.MDCManager; +import org.springframework.context.annotation.Profile; +import org.springframework.http.HttpEntity; +import org.springframework.http.HttpHeaders; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Component; +import org.springframework.web.client.RestTemplate; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.HashMap; +import java.util.Map; + +@Slf4j +@Profile("!local") +@Component +@Setter +public class DiscordLogAppender extends AppenderBase { + private String discordLogUrl; + + @Override + public void start() { + if (discordLogUrl == null || discordLogUrl.isEmpty() ) { + addError("Discord is not configured properly. Please set the discordLogUrl"); + return; + } + super.start(); + } + + @Override + protected void append(ILoggingEvent eventObject) { + Map mdcPropertyMap = eventObject.getMDCPropertyMap(); + + String level = eventObject.getLevel().levelStr; + String exceptionBrief = ""; + String exceptionDetail = ""; + IThrowableProxy throwable = eventObject.getThrowableProxy(); + + if (throwable != null) { + exceptionBrief = throwable.getClassName() + ": " + throwable.getMessage(); + } + + if (exceptionBrief.equals("")) { + exceptionBrief = "EXCEPTION 정보가 남지 않았습니다."; + } + + StringBuilder logMessage = new StringBuilder(); + + appendWithNewLine(logMessage, "[" + level + " - 문제 간략 내용] " + exceptionBrief); + appendWithNewLine(logMessage, "[Time] " + LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))); + appendWithNewLine(logMessage, "[" + MDCManager.MDC_REQUEST_URI + "] " + StringEscapeUtils.escapeJson(mdcPropertyMap.get(MDCManager.MDC_REQUEST_URI))); + appendWithNewLine(logMessage, "[" + MDCManager.MDC_USER_IP + "] " + StringEscapeUtils.escapeJson(mdcPropertyMap.get(MDCManager.MDC_USER_IP))); + appendWithNewLine(logMessage, "[" + MDCManager.MDC_HEADER + "] " + StringEscapeUtils.escapeJson(mdcPropertyMap.get(MDCManager.MDC_HEADER).replaceAll("[\\{\\{\\}]", ""))); + appendWithNewLine(logMessage, "[" + MDCManager.MDC_REQUEST_COOKIES + "] " + StringEscapeUtils.escapeJson(mdcPropertyMap.get(MDCManager.MDC_REQUEST_COOKIES).replaceAll("[\\{\\{\\}]", ""))); + appendWithNewLine(logMessage, "[" + MDCManager.MDC_PARAMETER + "] " + StringEscapeUtils.escapeJson(mdcPropertyMap.get(MDCManager.MDC_PARAMETER).replaceAll("[\\{\\{\\}]", ""))); + appendWithNewLine(logMessage, "[" + MDCManager.MDC_BODY + "] " + StringEscapeUtils.escapeJson(mdcPropertyMap.get(MDCManager.MDC_BODY))); + + sendToDiscord(logMessage.toString()); + + if (throwable != null) { + exceptionDetail = ThrowableProxyUtil.asString(throwable); + String exception = "[Exception 상세 내용] " + exceptionDetail.substring(0, 1000); + sendToDiscord(exception); + } + } + + private void appendWithNewLine(StringBuilder sb, String text) { + sb.append(text).append("\n"); + } + + private void sendToDiscord(String logMessage) { + if (logMessage.length() > 2000) { + logMessage = logMessage.substring(0, 1950) + "......"; + } + + RestTemplate restTemplate = new RestTemplate(); + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_JSON); + Map payload = new HashMap<>(); + payload.put("content", logMessage); + + HttpEntity> request = new HttpEntity<>(payload, headers); + + try { + ResponseEntity response = restTemplate.postForEntity(discordLogUrl, request, String.class); + + if (!response.getStatusCode().is2xxSuccessful()) { + addError("Failed to send log message to Discord: " + response.getStatusCode()); + } + } catch (Exception e) { + log.error("Exception occurred while sending log message to Discord", e); + } + } +} From c3a7d46c40174ba70c0ccb982c91d76cf7e27e97 Mon Sep 17 00:00:00 2001 From: gardening-y Date: Wed, 2 Oct 2024 23:17:40 +0900 Subject: [PATCH 11/13] =?UTF-8?q?[chore]=20logback=20=EC=84=A4=EC=A0=95=20?= =?UTF-8?q?=ED=8C=8C=EC=9D=BC=20-=20#226?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dateroad-api/src/main/resources/logback-spring.xml | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 dateroad-api/src/main/resources/logback-spring.xml diff --git a/dateroad-api/src/main/resources/logback-spring.xml b/dateroad-api/src/main/resources/logback-spring.xml new file mode 100644 index 0000000..6518d31 --- /dev/null +++ b/dateroad-api/src/main/resources/logback-spring.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file From f5266a0107175e5d827f86f32ec217e0395f6b24 Mon Sep 17 00:00:00 2001 From: gardening-y Date: Wed, 2 Oct 2024 23:18:05 +0900 Subject: [PATCH 12/13] =?UTF-8?q?[chore]=20logback=20discord-appender=20?= =?UTF-8?q?=EB=93=B1=EB=A1=9D=20-=20#226?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/resources/discord-appender.xml | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 dateroad-api/src/main/resources/discord-appender.xml diff --git a/dateroad-api/src/main/resources/discord-appender.xml b/dateroad-api/src/main/resources/discord-appender.xml new file mode 100644 index 0000000..2d75756 --- /dev/null +++ b/dateroad-api/src/main/resources/discord-appender.xml @@ -0,0 +1,18 @@ + + + + + + + + ERROR + + + + + + + ERROR + + + \ No newline at end of file From 32cb28066947a2a24f04049b3cba959f2e9a81f7 Mon Sep 17 00:00:00 2001 From: gardening-y Date: Wed, 2 Oct 2024 23:18:17 +0900 Subject: [PATCH 13/13] =?UTF-8?q?[chore]=20logback=20console-appender=20?= =?UTF-8?q?=EB=93=B1=EB=A1=9D=20-=20#226?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dateroad-api/src/main/resources/console-appender.xml | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 dateroad-api/src/main/resources/console-appender.xml diff --git a/dateroad-api/src/main/resources/console-appender.xml b/dateroad-api/src/main/resources/console-appender.xml new file mode 100644 index 0000000..c5e16e0 --- /dev/null +++ b/dateroad-api/src/main/resources/console-appender.xml @@ -0,0 +1,7 @@ + + + + %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + \ No newline at end of file