Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 6 additions & 1 deletion src/main/java/umc/th/juinjang/config/ApiFilterConfig.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import java.util.List;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
Expand All @@ -11,10 +12,14 @@
@Configuration
@Slf4j
public class ApiFilterConfig {

@Value("${logging.api.excluded-paths}")
private List<String> excludedUrls;

@Bean
public FilterRegistrationBean<APILoggerFilter> loggingFilter() {
FilterRegistrationBean<APILoggerFilter> registrationBean = new FilterRegistrationBean<>();
registrationBean.setFilter(new APILoggerFilter());
registrationBean.setFilter(new APILoggerFilter(excludedUrls));
registrationBean.setOrder(Ordered.HIGHEST_PRECEDENCE); // 순서 설정
registrationBean.setUrlPatterns(List.of("/*"));
return registrationBean;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,26 +6,38 @@
import jakarta.servlet.FilterChain;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.util.List;
import java.util.UUID;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.MDC;
import org.springframework.util.AntPathMatcher;
import org.springframework.web.filter.OncePerRequestFilter;
import org.springframework.web.util.ContentCachingResponseWrapper;

@Slf4j
public class APILoggerFilter extends OncePerRequestFilter {

private final APILoggerPrinter apiLoggerPrinter = new APILoggerPrinter();
private static final Logger logger = getLogger(APILoggerFilter.class);
private final AntPathMatcher pathMatcher = new AntPathMatcher();
private final List<String> EXCLUDED_URLS;

public APILoggerFilter(List<String> EXCLUDED_URLS) {
this.EXCLUDED_URLS = EXCLUDED_URLS;
}

@Override
protected void doFilterInternal(HttpServletRequest servletRequest, HttpServletResponse servletResponse, FilterChain chain ) {
registerRequestId(UUID.randomUUID().toString());

CustomContentCachingHttpRequestWrapper requestWrapper = new CustomContentCachingHttpRequestWrapper(servletRequest);
ContentCachingResponseWrapper responseWrapper = new ContentCachingResponseWrapper(servletResponse);;
ContentCachingResponseWrapper responseWrapper = new ContentCachingResponseWrapper(servletResponse);
registerRequestId(UUID.randomUUID().toString());

try {
if (shouldNotFilter(requestWrapper)) {
chain.doFilter(requestWrapper, responseWrapper);
return;
}
apiLoggerPrinter.print(new APIRequestLoggerGenerator(requestWrapper));
chain.doFilter(requestWrapper, responseWrapper);
apiLoggerPrinter.print(new APIResponseLoggerGenerator(responseWrapper));
Expand All @@ -36,4 +48,9 @@ protected void doFilterInternal(HttpServletRequest servletRequest, HttpServletRe
MDC.clear();
}
}

@Override
protected boolean shouldNotFilter(HttpServletRequest request) {
return EXCLUDED_URLS.stream().anyMatch(pattern -> pathMatcher.match(pattern, request.getRequestURI()));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@

import static umc.th.juinjang.utils.LoggerProvider.getLogger;

import java.nio.charset.StandardCharsets;
import org.slf4j.Logger;
import org.slf4j.MDC;

Expand All @@ -21,7 +20,5 @@ protected StringBuilder getBaseLogInfo() {

abstract public String generateLog();

protected String getBody(byte[] info) {
return new String(info, StandardCharsets.UTF_8).replace("\n", "").replace("\r", ""); // 캐리지 리턴 제거 (운영체제별 줄바꿈 차이 대응).replace("\t", ""); // 탭 제거;
}
abstract protected String getBody(byte[] info);
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import static umc.th.juinjang.utils.LoggerProvider.getLogger;

import java.util.List;
import org.slf4j.Logger;
import org.springframework.stereotype.Component;

Expand All @@ -13,6 +14,6 @@ public APILoggerPrinter() {
}

public void print(APILoggerGenerator apiLoggerGenerator) {
logger.info(apiLoggerGenerator.generateLog());
logger.info(apiLoggerGenerator.generateLog());
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package umc.th.juinjang.controller.monitoring;

import jakarta.servlet.http.HttpServletRequest;
import java.nio.charset.StandardCharsets;
import java.util.Collections;
import java.util.stream.Collectors;

Expand Down Expand Up @@ -43,4 +44,8 @@ private String getHeadersAsString(HttpServletRequest request) {
.map(headerName -> headerName + "=" + request.getHeader(headerName))
.collect(Collectors.joining(", "));
}

protected String getBody(byte[] info) {
return new String(info, StandardCharsets.UTF_8).replace("\n", "").replace("\r", "");
}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package umc.th.juinjang.controller.monitoring;

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.nio.charset.StandardCharsets;
import org.springframework.web.util.ContentCachingResponseWrapper;

Expand All @@ -23,9 +25,19 @@ public String generateLog() {
}

protected String getBody(byte[] info) {
String responseBody = new String(info, StandardCharsets.UTF_8);
responseBody = responseBody.replaceAll("\"accessToken\":\"[^\"]*\"", "\"accessToken\":\"[TOKEN]\"");
responseBody = responseBody.replaceAll("\"refreshToken\":\"[^\"]*\"", "\"refreshToken\":\"[TOKEN]\"");
return responseBody;
String responseBody = "";
try {
ObjectMapper objectMapper = new ObjectMapper();
JsonNode rootNode = objectMapper.readTree(new String(info, StandardCharsets.UTF_8));
responseBody = replaceToken(rootNode.path("message").asText("N/A"));
} catch (Exception e) {
logger.error("responseBody 추출 오류");
}
return responseBody;
}

private String replaceToken(String responseBody) {
return responseBody.replaceAll("\"accessToken\":\"[^\"]*\"", "\"accessToken\":\"[TOKEN]\"")
.replaceAll("\"refreshToken\":\"[^\"]*\"", "\"refreshToken\":\"[TOKEN]\"");
}
}
2 changes: 1 addition & 1 deletion src/main/resources/logback-appender.xml
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
<property name="ERROR_LOG_PATTERN" value="[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%-5level] [%X{request_id:-NORequestID}] [%X{user_id:-unknown}] [%thread] [%logger{1}] - %msg%n"/>

<property name="API_FILE_LOG_PATTERN" value="[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%-5level] [%thread] [%logger{1}] - %msg%n"/>
<property name="API_CONSOLE_LOG_PATTERN" value="[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%clr-5level] [%thread] [%logger{1}] - %msg%n"/>
<property name="API_CONSOLE_LOG_PATTERN" value="[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%clr(%-5level)] [%thread] [%logger{1}] - %msg%n"/>

<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<layout class="ch.qos.logback.classic.PatternLayout">
Expand Down
2 changes: 0 additions & 2 deletions src/main/resources/logback-dev.xml
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,4 @@

<logger name="org.hibernate" level="ERROR"/>
<logger name="org.springframework.web" level="INFO"/>
<logger name="org.springframework.boot.actuate.endpoint.web" level="ERROR" />
<logger name="io.micrometer.prometheus" level="ERROR" />
</configuration>
1 change: 1 addition & 0 deletions src/main/resources/logback-local.xml
Original file line number Diff line number Diff line change
Expand Up @@ -19,4 +19,5 @@

<logger name="org.hibernate" level="ERROR"/>
<logger name="org.springframework.web" level="INFO"/>
<logger name="org.springframework.boot.start.endpoint.web" level="ERROR" additivity="false" />
</configuration>
2 changes: 0 additions & 2 deletions src/main/resources/logback-prod.xml
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,4 @@

<logger name="org.hibernate" level="ERROR"/>
<logger name="org.springframework.web" level="INFO"/>
<logger name="org.springframework.boot.actuate.endpoint.web" level="ERROR" />
<logger name="io.micrometer.prometheus" level="ERROR" />
</configuration>